假设我有一个类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
for BasicDate
,但DDMMYYYY
带有EuroDate
. 这仍然很好。
但如果我这样做:
EuroDate today = [EuroDate dateWithMonth:10 andDay:18 andYear:2013];
这将调用已继承的BasicDate
工厂方法。EuroDate
问题是,还记得BasicDate
工厂方法的样子吗? return [[BasicDate alloc] ...]
因此,尽管我想将它存储为 a ,但仍将其变形为 a today
,因此如果我调用该方法,它将打印而不是.BasicDate
EuroDate
description
10182013
18102013
我发现这个问题有两种解决方案。
解决方案1:更改BasicDate
工厂方法。而不是return [[BasicDate alloc] ...
,我可以改为这样做return [[[self class] alloc] ...]
这有效,并将允许我将此方法用于BasicDate
或任何子BasicDate
类,它将返回正确的对象类型。
解决方案2:Override
工厂方法。我是否覆盖它以引发异常或覆盖它以执行return [[EuroDate alloc] ...]
. 覆盖它的问题是我必须覆盖每个子类的每个工厂方法。
哪个更好?我可能缺少的两种可能的解决方案有哪些缺点?在 Objective C 中处理这个问题的标准方法是什么?