从其超类调用子类的方法

Con*_*sed 10 inheritance subclass objective-c superclass

我有两个班,命名ParentChild,如下图所示.ParentChild 我可以通过使用关键字从其子类调用超类的方法的超类super.是否可以从其超类中调用子类的方法?

Child.h

#import <Foundation/Foundation.h>
#import "Parent.h"

@interface Child : Parent {

}

- (void) methodOfChild;

@end
Run Code Online (Sandbox Code Playgroud)

Child.m

#import "Child.h"

@implementation Child

- (void) methodOfChild {

    NSLog(@"I'm child");

}

@end
Run Code Online (Sandbox Code Playgroud)

Parent.h:

#import <Foundation/Foundation.h>

@interface Parent : NSObject {

}

- (void) methodOfParent;

@end
Run Code Online (Sandbox Code Playgroud)

Parent.m:

#import "Parent.h"

@implementation Parent

- (void) methodOfParent {

    //How to call Child's methodOfChild here?

}

@end
Run Code Online (Sandbox Code Playgroud)

在app delegate的.m文件头中导入"Parent.h".

App代表的application:didFinishLaunchingWithOptions:方法..

Parent *parent = [ [Parent alloc] init];

[parent methodOfParent];

[parent release];
Run Code Online (Sandbox Code Playgroud)

Ada*_*ght 59

你可以像Objective C方法一样调度动态.只需调用它[self methodOfChild],这可能会生成一个编译器警告(您可以通过强制转换self为静音id).

但是,为了善良的爱,不要这样做.父母应该为子女提供,而不是为父母提供子女.知道子类新方法的父是一个巨大的设计问题,在继承链上创建了错误的强耦合.如果父母需要它,为什么它不是父母的方法?

  • 可能原始海报正在考虑C++风格的抽象基类(即,定义方法但不提供实现的基类),正确的建议是在父类上提供空实现,让子项覆盖它们当且仅当它有关系? (7认同)

sEl*_*yan 6

从技术上讲,你可以做到.但我建议你改变你的设计.您可以声明协议并使您的子类采用该协议.然后你必须检查孩子是否从超类中采用该协议并从超类中调用该方法.


hel*_*ioz 5

你可以用这个:

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
Run Code Online (Sandbox Code Playgroud)

父母知道孩子和孩子可以选择如何实现这个功能.