我有一個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