我只是想谈谈设计概念和可以出现的案例。
我有一个名为 Range 的基类,如下所示:
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;
};
Month 的构造函数之一如下所示:
ptiDate::Month::Month(int v):Range(12,1)
{
SetValue(v);
}
但是到了定义 Day 类的时候,我原本打算创建一个 Day::Range 基类,从中派生 WeekDay 和 MonthDay 类,但觉得这会创建一个混乱的 API。当我尝试同时封装 WeekDay 和 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;
};
然后是我的困境:由于歧义,我不再想继承 Range SetMax 和 SetMin 方法。IE 我是在设置一周中的最大天数还是一个月中的天数...嗯,一周中的天数是固定的,所以 Day::Range::max 和 Day::Range::min 指的是一个月中的天数和一周中的哪一天刚刚弄清楚....
我会很好奇其他人是如何设计这个的。
引发:
Date Today(Month(3), Day(19), Year(2012));
受 Scott Meyers 启发的想法,Effective C++ (3rd Ed),第 80 页 [第 18 项]