iPhone - 抽象类的init方法

时间:2010-03-29 22:39:31

标签: iphone objective-c abstract-class

我想创建具有以下属性的Car,Vehicle和Airplane类:

  • 汽车和飞机都是车辆的子类。
  • Car and Airplane都有一个initWithString方法。
  • Car和Airplane的initWithString方法的可接受输入字符串不重叠。
  • 车辆“几乎是抽象的”,因为任何初始化的实例都应该是汽车或飞机。
  • 可以将字符串传递给Vehicle并获取Car实例,Airplane实例或nil,具体取决于输入字符串。

我更喜欢任何特定的设计模式?特别是对于Vehicle的initWithString和/或newVehicleWithString方法。

2 个答案:

答案 0 :(得分:4)

您需要的是“类群集”模式。您的Vehicle initWithString:方法可能如下所示:

- (id) initWithString:(NSString *)mode {
  // note that we don't call [super init] in a class cluster. 
  // instead, we have to release self because it's an unwanted Vehicle instance
  [self release];
  if([mode isEqualToString:@"wheels"]) {
    return [[Car alloc] initWithString:@"wheels"];
  }
  if([mode isEqualToString:@"wings"]) {
    return [[Airplane alloc] initWithString:@"wings"];
  }
  return nil;  //alternately, raise NSInvalidArgumentException
}

答案 1 :(得分:0)

引用超类中的子类不是一个好主意。

如果你真的必须这样做,你至少应该采用像vehicleWithString:这样的类方法。

事实上,我怀疑另一种方法(使用vehicle initWithString:创建汽车或飞机的实例)会起作用。