Наследование в Objective-c и функциях - PullRequest
1 голос
/ 11 января 2010

У меня есть класс X, абстрактный класс и классы A и B, которые наследуют его. Каждый из классов A и B имеет свою собственную функцию return_something. В другом месте у меня есть другой метод, который вызывает return_something для серии объектов, все типа X. return_something возвращает что-то другое в зависимости от того, является ли это A или B, поэтому я могу просто вызвать id * result = [x return_something ).

Я могу все это спроектировать, но когда я приступаю к его реализации, я не знаю, что поместить в родительский класс X. Он должен иметь функцию return_something, чтобы его можно было вызывать, но сама функция определяется в дочерних классах. Я могу объявить это в родительском и обоих дочерних элементах, но Мне нечего возвращать из реализации X - возвращаемый объект зависит от повторного определения дочернего элемента.

Это было бы хорошо для невозвратного метода, но как я собираюсь использовать наследование и полиморфизм с функцией?

Ответы [ 2 ]

6 голосов
/ 11 января 2010

Самое простое, что нужно сделать - это сгенерировать исключение из "базовой" функции. Таким образом, вы будете знать, если его вызвали по ошибке.

Другие языки, которые обеспечивают явную «абстрактность», не требуют тел методов для абстрактных методов.

5 голосов
/ 11 января 2010

Используйте протокол Objective-C вместо абстрактного базового класса:

@protocol ProtocolX
-(int)return_something;
@end

@interface ClassA : NSObject <ProtocolX> {
}
-init;
-(int)return_something;
@end

@interface ClassB : NSObject <ProtocolX> {
}
-init;
-(int)return_something;
@end

@implementation ClassA : NSObject <ProtocolX>
-(int)return_something { return 1; }
-init { retur [super init]; }
@end

@implementation ClassB : NSObject <ProtocolX>
-(int)return_something { return 3; }
-init { retur [super init]; }
@end

Ссылки типа id<ProtocolX> могут затем передаваться и использоваться:

id<ProtocolX> ref = [[ClassA alloc] init];
int myIntForA = [ref return_something];
[ref release];
ref = [[ClassB alloc] init];
int myIntForB = [ref return_something];
[ref release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...