デザイン コンセプトと、これが表示されるケースについて説明します。
次のような 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 &);
};
この基本クラスは、作成した Date & Time クラスで使用されます。
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 のコンストラクターの 1 つは次のようになります。
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 は Max days of the week または days of the month を設定していますか...まあ、曜日は固定されているので、Day::Range::max と Day::Range::min は月の日を参照し、曜日はちょうど把握されています....
他の人がこれをどのように設計したか興味があります。
を生じさせる:
Date Today(Month(3), Day(19), Year(2012));
Scott Meyers、Effective C++ (第 3 版)、80 ページ [項目 18] に触発されたアイデア