Вызвать метод подкласса из его суперкласса
У меня есть два класса, названных Parent
а также Child
, как показано ниже. Parent
это суперкласс Child
Я могу вызвать метод суперкласса из его подкласса, используя ключевое слово super
, Можно ли вызвать метод подкласса из его суперкласса?
Child.h
#import <Foundation/Foundation.h>
#import "Parent.h"
@interface Child : Parent {
}
- (void) methodOfChild;
@end
Child.m
#import "Child.h"
@implementation Child
- (void) methodOfChild {
NSLog(@"I'm child");
}
@end
Parent.h:
#import <Foundation/Foundation.h>
@interface Parent : NSObject {
}
- (void) methodOfParent;
@end
Parent.m:
#import "Parent.h"
@implementation Parent
- (void) methodOfParent {
//How to call Child's methodOfChild here?
}
@end
Импортируйте "Parent.h" в заголовок файла.m делегата приложения.
Приложение делегата application:didFinishLaunchingWithOptions:
способ..
Parent *parent = [ [Parent alloc] init];
[parent methodOfParent];
[parent release];
6 ответов
Вы можете, поскольку диспетчеризация метода Objective C все динамична. Просто позвони [self methodOfChild]
, который, вероятно, сгенерирует предупреждение компилятора (которое можно отключить, приведя self
в id
).
Но ради любви к Богу, не делай этого. Родители должны обеспечивать своих детей, а не детей для своих родителей. Родитель, зная о новых методах подклассов, является огромной проблемой проектирования, создавая сильную связь неправильным путем вверх по цепочке наследования. Если родитель нуждается в этом, почему это не метод для родителя?
Технически вы можете сделать это. Но я предлагаю вам изменить свой дизайн. Вы можете объявить протокол и заставить ваш дочерний класс принять этот протокол. Затем вы можете проверить, принимает ли ребенок этот протокол из суперкласса, и вызвать метод из суперкласса.
Вы можете использовать это:
Parent.m
#import "Parent.h"
@implementation Parent
- (void) methodOfChild {
// this should be override by child classes
NSAssert(NO, @"This is an abstract method and should be overridden");
}
@end
Родитель знает о ребенке, и у ребенка есть выбор, как реализовать функцию.
super
означает "вызвать метод, отправляющий на родительский класс", так что можете использовать super
в подклассе, потому что подкласс имеет только один родительский класс. Класс может иметь много классов _sub_classes, так как вы узнаете, какую реализацию метода вызывать в общем случае? (Следовательно, нет такой вещи как sub
ключевое слово.)
Однако в вашем примере у вас есть два отдельных метода. Ничто не мешает вам (если у вас есть очень веские причины для того, чтобы делать что-то подобное!), Чтобы сказать родителю:
- (void) methodOfParent {
[self methodOfChild];
}
если ваш супер имеет несколько подводных лодок, то перейдите на этот метод для конкретного подводного лодки
if ([super isKindOfClass:[specificsub class]]) {
[specificsub methodName];
}
если ваш супер имеет дело с этим объектом (этим подпрограммой), то метод подпрограммы loggedin будет вызван другим способом - это в вашем суперклассе
super *some = [[sub alloc] init];
[some methodName];
Это может быть сделано путем перегрузки метода в подклассе. То есть создать метод в родительском классе и переместить то же самое в подклассе.