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:
для создания экземпляров автомобилей или самолетов) будет работать.