クラスと、呼び出されBasicDate
た のサブクラスがあるとします。クラス間の違いは、月-日-年と日-月-年です。同じクラスのメソッドを別の方法で出力する方がおそらく良いと思いますが、それはこの質問のポイントではありません。BasicDate
EuroDate
BasicDate
以下がありますinit method
:
-(id)initWithMonth:(int)m andDay:(int)d andYear:(int)y {
if(self = [super init]) { /*initialize*/ } return self;
}
マッチングfactory method
は次のようになります。
+(BasicDate)dateWithMonth:(int)m andDay:(int)d andYear:(int)y {
return [[BasicDate alloc] initWithMonth: m andDay: d andYear: y];
}
しかし、私のサブクラスの場合、次のようなものEuroDate
を使用しfactory method
ます:
+(EuroDate)dateWithDay:(int)d andMonth:(int)m andYear:(int)y {
return [[EuroDate alloc] initWithDay: d andMonth: m andYear: y];
} //we can assume that EuroDate includes this init method...
これで問題ありません。ここで、両方のクラスに独自の があると仮定します。description method
これはに対して出力MMDDYYYY
されますBasicDate
がDDMMYYYY
、EuroDate
. これでもまだ大丈夫です。
しかし、私がこれを行うと:
EuroDate today = [EuroDate dateWithMonth:10 andDay:18 andYear:2013];
これにより、継承したBasicDate
ファクトリ メソッドが呼び出されます。問題は、のファクトリ メソッドが EuroDate
どのように見えるか覚えているかということです。BasicDate
return [[BasicDate alloc] ...]
したがって、 として保存したいにもかかわらずtoday
にポリモーフするため、メソッドを呼び出すと、ではなく が出力されます。BasicDate
EuroDate
description
10182013
18102013
私が見つけたこの問題には2つの解決策があります。
解決策 1:BasicDate
のファクトリ メソッドを変更します。ではなくreturn [[BasicDate alloc] ...
、代わりにこれを行うことができますこれは機能し、またはのサブクラスreturn [[[self class] alloc] ...]
に対してこのメソッドを使用できるようにし、正しいオブジェクトタイプを返します。BasicDate
BasicDate
解決策 2:Override
ファクトリ メソッド。オーバーライドして例外をスローするか、オーバーライドして do にするかreturn [[EuroDate alloc] ...]
。オーバーライドの問題は、すべてのサブクラスのすべてのファクトリ メソッドをオーバーライドする必要があることです。
どちらが良いですか?私が見逃している可能性のある2つの解決策の欠点は何ですか? Objective C でこの問題を処理する標準的な方法は何ですか?