我只是要在设计概念和这种情况下,可以显示的钟声。
我有一个名为范围内的基类,像这样:
class Range
{
private:
int max;
int min;
int value;
virtual void SetMax(int);
virtual void SetMin(int);
public:
Range(int max, int min);
virtual void SetValue(int v);
virtual int GetValue() const;
virtual ~Range();
Range & operator =(int);
Range & operator =(const Range &);
};
,并在此基础类是在我们写了一个日期&时间类使用:
class Month : public Range
{
public:
Month();
Month(int);
Month(const Month &);
~Month();
Month & operator =(int);
Month & operator =(const Month &);
const wchar_t * const AsString() const;
};
和月的一个构造看起来像这个:
ptiDate::Month::Month(int v):Range(12,1)
{
SetValue(v);
}
但是什么时候来定义Day类的时候,我原本打算创建一个Day :: Range基类,从中派生WeekDay和MonthDay类,但是觉得这造成了一个凌乱的API。当我试图同时封装平日和MONTHDAY,我尝试这样的:
这是我的尝试:
class Day : public Range
{
private:
bool LeapDay;
int wday;
int mday;
public:
Day();
Day(int);
Day(const Day &);
~Day();
Day & operator =(int);
Day & operator =(const Day &);
const wchar_t * const WeekDayAsString() const;
const wchar_t * const MonthDayAsString() const;
bool isLeapDay() const;
};
,然后我的困境:我不再想继承范围SETMAX和SetMin方法由于模糊不清。 I.E.我是否设置了一周中的最大日期或一个月中的某几天......那么,本周的日期是固定的,因此Day :: Range :: max和Day :: Range :: min指的是月份和日期的一周只是想通了....
我会好奇别人会如何设计这一点。
从而引发:
Date Today(Month(3), Day(19), Year(2012));
斯科特迈尔斯,有效的C++(第三版),第80页[第18项]
是不可能的,在这种情况下,激发了一个想法的基础类是不是正确的,当你派生出一个你正在说的类时,“嗨!,这个类是基础的扩展,并且是一个基础” – DGomez 2012-04-16 19:22:52
你可能需要两个固有的基类,这可能导致[钻石继承](http://en.wikipedia.org/wiki/Diamond_problem),如果你坚持让派生类保持一个相似者的相似度。但说实话,我无法想象在什么情况下,任何人都不会想要做你所描述的事情,因为这不是一种非常通用的做法。 – chrisaycock 2012-04-16 19:24:22
你想做什么? – 2012-04-16 22:09:48