Полиморфизм и реализации по умолчанию в Objective-C - PullRequest
0 голосов
/ 05 ноября 2010

В основном у меня есть родительский суперкласс, который называется MAMMAL. По умолчанию млекопитающее расширяет UIImageview. Теперь у меня есть класс тигра, который, в свою очередь, расширяет класс MAMMAL, а класс млекопитающих имеет метод кормления ребенка грудью.

В моем классе mammal.h я объявляю метод грудного вскармливания ребенка.

Теперь я хочу иметь возможность сделать что-то вроде добавления списка животных, который расширяет млекопитающее и имеет собственную реализацию грудного вскармливания, цикл и массив, и просто приведение к Млекопитающему и выполнение [грудное вскармливание млекопитающего].

Я бы хотел, чтобы каждое животное вызывало свой собственный метод грудного вскармливания, поскольку все они перевешивали его, но моя проблема в том, что оно вызовет грудное вскармливание у млекопитающего. Если я объявлю его там.

В Java я могу использовать интерфейс или просто иметь абстрактный класс с абстрактным методом и иметь различные реализации, переопределяющие метод.

Имеет ли это смысл? Моя проблема заключается в том, что если я не опущу метод грудного вскармливания у млекопитающего. Он вызовет метод грудного вскармливания у млекопитающего. И если я пропущу метод грудного вскармливания у млекопитающего. неправильно реализовал класс mammal.h. Если я это сделаю, будет вызван метод кормления ребенка грудью. Должен ли я просто использовать протокол здесь, но, насколько я понимаю, протокол не совпадает с интерфейсом в Java.

Я не знаю, имеет ли это смысл, но все равно спасибо.

Ответы [ 3 ]

5 голосов
/ 05 ноября 2010

Следующий сценарий:

  • Mammal.h: - (void)method;
  • Mammal.m: - (void)method { NSLog(@"Mammal"); }
  • Monkey.h: @class Monkey : Mammal
  • Monkey.m: - (void)method { [super method]; NSLog(@"Monkey"); }
  • Somewhere.m: Mammal *monkey = [[Monkey alloc] init]; [monkey method];

Должен дать:

Млекопитающее

Обезьяна

ОБНОВЛЕНИЕ: конечно, вы можете удалить вызов на [super method], если хотите.Просто показываю возможность.

2 голосов
/ 05 ноября 2010

Objective-C разрешает все динамически, поэтому у него нет абстрактных базовых классов или интерфейсов. Наиболее близкий к абстрактному методу метод - написать реализацию по умолчанию (в родительском классе), которая выдает исключение.

@implementation Mammal

- (void)breastfeedBaby
{
    [NSException raise:@"MethodNotImplemented"
                format:@"Class %@ failed to implement required method %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
}

@end

Было бы неплохо отлавливать недостающие методы во время компиляции, но это просто невозможно в языке с динамической типизацией.

0 голосов
/ 05 ноября 2010

Даже если вы приведете объект к типу MAMMAL, он все равно вызовет метод -breastfeedbaby для любого подкласса.Это потому, что Objective-C использует отправку сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...