Вызов метода подкласса из его суперкласса
у меня есть два класса, названные Parent
и Child
, как показано ниже. Parent
суперкласс Child
Я могу вызвать метод суперкласса из подкласса с помощью ключевого слова super
. Можно ли вызвать метод подкласса из его суперкласс?
ребенок.h
#import <Foundation/Foundation.h>
#import "Parent.h"
@interface Child : Parent {
}
- (void) methodOfChild;
@end
ребенок.м
#import "Child.h"
@implementation Child
- (void) methodOfChild {
NSLog(@"I'm child");
}
@end
родитель.h:
#import <Foundation/Foundation.h>
@interface Parent : NSObject {
}
- (void) methodOfParent;
@end
родитель.м:
#import "Parent.h"
@implementation Parent
- (void) methodOfParent {
//How to call Child's methodOfChild here?
}
@end
Импорт "Родителя.h " в делегате приложения .заголовочный файл м.
приложения делегата application:didFinishLaunchingWithOptions:
метод..
Parent *parent = [ [Parent alloc] init];
[parent methodOfParent];
[parent release];
6 ответов
вы можете, так как отправка метода Objective C является динамической. Просто позвоните с [self methodOfChild]
, который, вероятно, сгенерирует предупреждение компилятора (которое вы можете отключить, бросив self
to id
).
технически вы можете сделать это. Но я предлагаю вам изменить ваш дизайн. Вы можете объявить протокол и заставить свой дочерний класс принять этот протокол. Затем вы можете проверить, принимает ли ребенок этот протокол из суперкласса и вызвать метод из суперкласса.
вы можете использовать этот:
родитель.м
#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];
}
Если ваш супер имеет несколько подводных лодок, то пойти на это для конкретного метод sub
if ([super isKindOfClass:[specificsub class]]) {
[specificsub methodName];
}
Если ваш супер имеет дело с этим объектом (этим sub), поэтому метод sub loggedin будет называться по-другому, это у вас супер класс
super *some = [[sub alloc] init];
[some methodName];
Это можно сделать, перейдя на метод в подклассе. То есть создать метод в родительском классе и на этом в подкласс.