【发布时间】:2012-07-04 06:57:48
【问题描述】:
举一个真实世界的例子,假设基类是 Vehicle,具体类是 TwoWheeler 和 FourWheeler。现在车辆的类型 - TwoWheeler 或 FourWheeler,由基类 Vehicle 决定。当我使用 alloc-init 方法创建 TwoWheeler/FourWheeler 的实例时,它会调用如下所示的超级实现来设置 Vehicle 类中定义的公共属性的值,并且在这些属性中,其中一个是实际决定类型的类型是 TwoWheeler 或 FourWheeler。
if (self = [super initWithDictionary:dict]){
[self setOtherAttributes:dict];
return self;
}
现在,当我收集车辆时,其中一些可能是 TwoWheeler,而另一些可能是 FourWheeler。因此我不能像这样直接创建 TwoWheeler 或 FourWheeler 的实例
Vehicle *v = [[TwoWheeler alloc] initWithDictionary:dict];
有什么方法可以创建基类的实例,一旦我知道类型,根据类型创建子类的实例并返回它。使用当前的实现,它会导致无限循环,因为我从具体类调用超级实现。
当我不知道应该事先实例化哪个具体类时,处理这种情况的完美设计是什么?
【问题讨论】:
-
那么你想要一些特殊的setter方法来有条件地改变你的对象的类吗?
-
你为什么要让你的基类决定类型,基类甚至不应该知道类型!
标签: objective-c ios oop