iPhone - метод init абстрактного класса

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

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

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

2 ответа

Решение

Что вам нужно, так это шаблон "кластер классов". Ваш 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
}

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

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

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

Другие вопросы по тегам