init]作为工厂方法

ite*_*ter 0 oop objective-c

我想初始化一个超类的子类之一的实例,具体取决于init的参数:

[[Vehicle alloc] initWithItinerary: shortWay]; // returns a bicycle
[[Vehicle alloc] initWithItinerary: longWay];  // returns a car
Run Code Online (Sandbox Code Playgroud)

我找不到这样的代码示例.我想知道这在目标C中是不是惯用的,或者我只是在寻找合适的位置.

Dav*_*ong 6

你可以通过一个自定义init方法来做到这一点,但它有点乏味(你必须调用[super init],然后调用[self release],等等......).创建类方法Vehicle并将其用作工厂方法会更简单.例如:

+ (id) vehicleWithItinerary:(id)someItinerary {
  if ([someItinerary isAShortWay]) {
    return [[[Bicycle alloc] initWithItinerary:someItinerary] autorelease];
  } else if ([someItinerary isAMediumWay]) {
    return [[[RocketPack alloc] initWithItinerary:someItinerary] autorelease];
  } else if ([someItinerary isALongWay]) {
    return [[[Car alloc] initWithItinerary:someItinerary] autorelease];
  }
  return nil;
}
Run Code Online (Sandbox Code Playgroud)