我有一个UIViewController A和B.那的一个子类如果我有一个和 我想打电话给B的方法,它覆盖A,我该怎么做呢?
您只需调用该方法。如果该对象实际上是B的一个实例,那么该方法的B版本将被执行。如果该对象被实例化为A的一个实例,则将调用该方法的A版本。尝试一下为自己真正了解它:
@interface A : NSObject
{}
@end
@implementation A
- (void)whoAmI
{
NSLog(@"I'm an A\n);
}
@end
@interface B : A
@end
@implementation B
- (void)whoAmI
{
NSLog(@"I'm a B\n");
}
@end
//...
A *a = [[A alloc] init];
A *b = [[B alloc] init];
B *c = [[A alloc] init];
B *d = [[B alloc] init];
[a whoAmI]; // this will log "I'm an A"
[b whoAmI]; // this will log "I'm a B"
[c whoAmI]; // this will log "I'm an A"
[d whoAmI]; // this will log "I'm a B"
在子类中的实现,可以通过使用关键字super
代替self
调用父类的方法。例如,B的另一种方法可以称之为B的-whoAmI
这样的:
[self whoAmI];
,或者它可以调用它的父类的实现是这样的:
[super whoAmI];
这是在同一个方法的覆盖最有用,所以你可以保留继承的行为,但添加到它。 B的-whoAmI
可以实现这样的:
- (void)whoAmI
{
NSLog(@"I'm a B\n");
[super whoAmI];
}
在这种情况下,该片段上方将不得不在评论中所示的结果:
[a whoAmI]; // this will log "I'm an A"
[b whoAmI]; // this will log "I'm a B" followed by "I'm an A"
[c whoAmI]; // this will log "I'm an A"
[d whoAmI]; // this will log "I'm a B" followed by "I'm an A"
真正了解这个东西,因为它是从根本上理解如何是很重要的与不同类型的对象一起工作。所以花一些时间写这样的傻小示例程序,并不断提问,直到你确定你已经得到它。
我不太确定我明白你的意思。你可以发布你的代码,所以我可以看到你想要做什么? – 2012-02-04 00:04:17
添加了一行代码,说明我的意思 – xonegirlz 2012-02-04 00:08:18
子类化的重点是覆盖超类方法或添加新方法。所以你会创建一个子类的实例并调用该方法。你为什么要把超类转换成子类? – mbh 2012-02-04 00:08:45