我有两个名为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
在app delegate的.m文件头中导入“Parent.h”。
App委托的application:didFinishLaunchingWithOptions:
方法..
Parent *parent = [ [Parent alloc] init];
[parent methodOfParent];
[parent release];
答案 0 :(得分:59)
你可以像Objective C方法一样调度动态。只需使用[self methodOfChild]
调用它,这可能会生成编译器警告(您可以通过将self
强制转换为id
来保持沉默。)
但是,为了善良的爱,不要这样做。父母应该为子女提供,而不是为父母提供子女。知道子类新方法的父是一个巨大的设计问题,在继承链上创建了错误的强耦合。如果父母需要它,为什么它不是父母的方法?
答案 1 :(得分:6)
从技术上讲,你可以做到。但我建议你改变你的设计。您可以声明协议并使您的子类采用该协议。然后你必须检查孩子是否从超类中采用该协议并从超类中调用该方法。
答案 2 :(得分: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
父母知道孩子和孩子可以选择如何实现这个功能。
答案 3 :(得分:2)
super
表示“调用父类的方法调度”,因此可以在子类中使用super
,因为子类只有一个父类。一个类可以有很多_sub_classes,所以在一般情况下你怎么知道调用哪个方法实现? (因此没有sub
关键字。)
但是,在您的示例中,您有两种不同的方法。没有什么可以阻止你(假设你有非常好的理由做这样的事情!)来自父母说,
- (void) methodOfParent {
[self methodOfChild];
}
答案 4 :(得分:0)
如果您的超级有多个潜水艇,那么请针对具体的那个去 子方法
if ([super isKindOfClass:[specificsub class]]) {
[specificsub methodName];
}
如果你的超级正在处理那个对象(那个sub)那么sub的方法 loggedin将被称为另一种方式是在你的超类
super *some = [[sub alloc] init];
[some methodName];
答案 5 :(得分:0)
这可以通过在子类中重复使用该方法来完成。那就是在父类中创建一个方法,并在子类中重复使用它。