Con*_*sed 10 inheritance subclass objective-c superclass
我有两个班,命名Parent
和Child
,如下图所示.Parent
是Child
我可以通过使用关键字从其子类调用超类的方法的超类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
).
但是,为了善良的爱,不要这样做.父母应该为子女提供,而不是为父母提供子女.知道子类新方法的父是一个巨大的设计问题,在继承链上创建了错误的强耦合.如果父母需要它,为什么它不是父母的方法?
你可以用这个:
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)
父母知道孩子和孩子可以选择如何实现这个功能.