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

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

Это может быть сделано путем перегрузки метода в подклассе. То есть создать метод в родительском классе и переместить то же самое в подклассе.

Другие вопросы по тегам