Вызов метода подкласса из его суперкласса - PullRequest
10 голосов
/ 22 сентября 2011

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

59 голосов
/ 22 сентября 2011

Вы можете, так как диспетчеризация метода Objective C все динамична. Просто вызовите его с помощью [self methodOfChild], что, вероятно, сгенерирует предупреждение компилятора (которое можно отключить, приведя self к id).

Но, ради любви к добру, не делай этого. Родители должны обеспечивать своих детей, а не детей для своих родителей. Родитель, зная о новых методах подклассов, является огромной проблемой проектирования, создавая сильную связь неправильным путем вверх по цепочке наследования. Если родитель нуждается в этом, почему это не метод для родителя?

6 голосов
/ 22 сентября 2011

Технически вы можете это сделать. Но я предлагаю вам изменить свой дизайн. Вы можете объявить протокол и заставить ваш дочерний класс принять этот протокол. Затем вы можете проверить, принимает ли ребенок этот протокол из суперкласса, и вызвать метод из суперкласса.

5 голосов
/ 07 июня 2013

Вы можете использовать это:

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

Родитель знает о ребенке, и у ребенка есть выбор, как реализовать функцию.

2 голосов
/ 22 сентября 2011

super означает «вызов метода, отправляющего родительский класс», поэтому можно использовать super в подклассе, поскольку подкласс имеет только один родительский класс.Класс может иметь много классов _sub_classes, так как вы узнаете, какую реализацию метода вызывать в общем случае?(Следовательно, не существует такого понятия, как ключевое слово sub).

Однако в вашем примере у вас есть два отдельных метода.Ничто не мешает вам (если у вас есть очень веские причины для того, чтобы сделать что-то подобное!) От произнесения в родителе

- (void) methodOfParent {
    [self methodOfChild];
}
0 голосов
/ 12 апреля 2016

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

0 голосов
/ 23 октября 2014

если в вашем супер есть несколько сабов, то выбирайте этот метод sub

if ([super isKindOfClass:[specificsub class]]) {
                [specificsub methodName];
            }

если ваш супер имеет дело с этим объектом (этим подпрограммой), значит метод подпрограммы loggedin будет называться иначе у вас супер класс

super *some = [[sub alloc] init];
[some methodName];
...