Вызов метода подкласса из его суперкласса

у меня есть два класса, названные 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];

Это можно сделать, перейдя на метод в подклассе. То есть создать метод в родительском классе и на этом в подкласс.