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

У меня есть два класса с именем 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

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