iPhone - метод init абстрактного класса - PullRequest
1 голос
/ 30 марта 2010

Я хочу создать классы Car, Vehicle и Airplane со следующими свойствами:

  • Автомобиль и Самолет являются подклассами Транспортного средства.
  • Автомобиль и Самолет имеют метод initWithString.
  • Допустимые входные строки для методов initWithString автомобилей и самолетов не перекрываются.
  • Автомобиль "почти абстрактный", в том смысле, что любой инициализированный экземпляр должен быть либо автомобилем, либо самолетом.
  • В зависимости от входной строки можно передать строку в Vehicle и получить экземпляр Car, экземпляр Airplane или nil.

Какой-то конкретный шаблон дизайна, который я бы предпочел? В частности, для методов Vehicle initWithString и / или newVehicleWithString.

Ответы [ 2 ]

4 голосов
/ 30 марта 2010

Вам нужен шаблон "кластер классов". Ваш 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
}
0 голосов
/ 30 марта 2010

Ссылка на подкласс из суперкласса не очень хорошая идея.

Если вам действительно нужно это сделать, вы должны по крайней мере использовать метод класса, такой как vehicleWithString:.

На самом деле, я сомневаюсь, что другой подход (использующий vehicle initWithString: для создания экземпляров Car или Airplane) сработает.

...