Вызовите метод подкласса из своего суперкласса
У меня есть два класса с именем 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 methodOfChild here?
}
@end
Импортировать "Parent.h" в заголовке файла .m. в приложении.
Участник делегата application:didFinishLaunchingWithOptions:
метод.
Parent *parent = [ [Parent alloc] init];
[parent methodOfParent];
[parent release];
Ответы
Ответ 1
Вы можете, поскольку отправка метода Objective C является динамической. Просто назовите его [self methodOfChild]
, который, вероятно, сгенерирует предупреждение о компиляторе (которое вы можете отключить, выбрав self
to id
).
Но, ради любви к добру, не делай этого. Родители должны обеспечивать своих детей, а не детей для своих родителей. Родитель, знающий о новых методах подкласса, - это огромная проблема дизайна, создающая сильное сцепление неправильного пути до цепочки наследования. Если родитель нуждается в этом, почему это не метод для родителя?
Ответ 2
Технически вы можете это сделать. Но я предлагаю вам изменить свой дизайн. Вы можете объявить протокол и сделать свой дочерний класс принятым этим протоколом. Затем вам нужно будет проверить, принимает ли ребенок этот протокол из суперкласса и вызывает метод из суперкласса.
Ответ 3
Вы можете использовать это:
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
Родитель знает о ребенке, и у ребенка есть выбор, как реализовать эту функцию.
Ответ 4
super
означает "вызывать метод, отправляющий родительский класс", поэтому можно использовать super
в подклассе, потому что подкласс имеет только один родительский класс. Класс может иметь много _sub_classes, но как вы узнаете, какую реализацию метода нужно вызвать, в общем случае? (Следовательно, нет ключевого слова sub
.)
Однако в вашем примере у вас есть два отдельных метода. Там вас не останавливает (при условии, что у вас есть очень веские причины делать что-то подобное!) От слова "родитель",
- (void) methodOfParent {
[self methodOfChild];
}
Ответ 5
если ваш супер имеет несколько подсетей, идите для этого для конкретного sub method
if ([super isKindOfClass:[specificsub class]]) {
[specificsub methodName];
}
если ваш супер имеет дело с этим объектом (этим суб), поэтому метод sub loggedin будет называться другим способом в суперкласс
super *some = [[sub alloc] init];
[some methodName];
Ответ 6
Это можно сделать, переместив метод в подкласс. Это создаст метод в родительском классе и перейдем к тому же в подклассе.