2012-02-03 55 views
0

所以我已經創建了一個UIViewController的子類。問題是,有沒有辦法讓我可以強制調用一個使用子類的方法,如果我創建的是超類。我知道這很愚蠢,因爲這與強迫哺乳動物稱狗的行爲是一樣的。但在做這件事之前,我確實首先確定那隻哺乳動物是一隻狗,否則我不會說它。這是一件壞事嗎?如果沒有,那我該怎麼做這樣的事情?我嘗試將超類轉換爲它的子類,然後執行方法調用,但不起作用。有什麼想法嗎?強制調用UIViewController的子類方法

所以我正在嘗試做什麼。我有一個UIViewController A和那個B的子類。如果我有A並且我想調用B的方法來覆蓋A,那麼我該怎麼做?我希望這是明確的

+0

我不太確定我明白你的意思。你可以發佈你的代碼,所以我可以看到你想要做什麼? – 2012-02-04 00:04:17

+0

添加了一行代碼,說明我的意思 – xonegirlz 2012-02-04 00:08:18

+0

子類化的重點是覆蓋超類方法或添加新方法。所以你會創建一個子類的實例並調用該方法。你爲什麼要把超類轉換成子類? – mbh 2012-02-04 00:08:45

回答

4

你如何聲明你的對象和它的實際是有區別的。 考慮這個例子:

Mammal *mammal = [[Dog alloc] init]; //Dog is a subclass of Mammal 

在這裏,你有一個指向Mammal對象,它實際指向的專業化Dog類的一個實例。這是有效的,因爲哺乳動物擁有一隻狗擁有的所有方法。

您可以檢查一些Mammal實例實際上是Dog是使用isKindOfClass:,像這樣:

if ([mammal isKindOfClass:[Dog class]]) { 
    [(Dog *)mammal bark]; 
} 

這是完全有效的。但是,如果您將創建mammal[[Mammal alloc] init]Dog類的檢查將失敗,您將無法調用任何只有Dog具有的方法。如果你不做這個檢查,這實際上會崩潰,因爲這個轉換不會以任何方式改變對象,它只是告訴編譯器「我知道我在做什麼,不要警告我」。

1

我相信你只能上升的層次結構,而不是下降。所以,基本上,你可以從你的類中調用超類,但不能調用子類。這裏沒有關係,除非你通過將自己的引用傳遞給它的超類來初始化你的子類。

這是有點你在找什麼?

+0

嗯..我初始化它,因爲它的超類 – xonegirlz 2012-02-04 00:15:30

+0

我不知道我知道這意味着什麼。超類永遠不會意識到它們的子類。 – 2012-02-04 00:16:49

0

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

真正瞭解這個東西,因爲它是從根本上理解如何是很重要的與不同類型的對象一起工作。所以花一些時間寫這樣的傻小示例程序,並不斷提問,直到你確定你已經得到它。