我想初始化一个超类的子类之一的实例,具体取决于init的参数:
[[Vehicle alloc] initWithItinerary: shortWay]; // returns a bicycle
[[Vehicle alloc] initWithItinerary: longWay]; // returns a car
Run Code Online (Sandbox Code Playgroud)
我找不到这样的代码示例.我想知道这在目标C中是不是惯用的,或者我只是在寻找合适的位置.
你可以通过一个自定义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)