2012-08-03 53 views
0

在Objective-C,怎麼會在一個超類來確定,如果一個特定的方法是由它(調用)子(仁)覆蓋叫什麼名字?如何確定一個方法是由一個子類

例如,在下文中,子類Z不重寫方法b爲此基類X會做一些額外的缺省處理。然而,ZY在子類Y中實現了b,因此不需要默認處理。

// base class X 
-(void)a 
{ 
    // do something 
} 

-(void)b 
{ 
    if("no_child_has_implemented_b") { 
     // add some default behavior 
    } 
} 


// child class Y : X 
-(void)a 
{ 
    [super a]; 
} 

-(void)b 
{ 
    [super b]; 
} 


// child class Z : X 
-(void)a 
{ 
    [super a]; 
} 

// child class ZY : X 
-(void)a 
{ 
    [super a]; 
} 

回答

3

在一個合理的正常OO設計中,你不應該有一個基類知道一個子類是否覆蓋它。如果你發現自己這樣做,這是一個code smell,通常意味着有更好的方式做事。

根據是否被覆蓋更改超法的行爲是不是在大多數情況下是個好主意,因爲這意味着超類的猜測子類的行爲和意圖。例如,如果有人某天某人寫了一個子類,希望能夠獲得超類提供的默認設置,這是因爲你沒有想到的原因?

在子類中調用超級版本時,重寫方法是非常正常的,而超級版本的基本設置與其類的相關,然後你的子類的重寫方法在調用super之後可以做更多的事情。如果這不能處理你的情況,你可以讓你的子類的方法不調用方法的超級版本 - 它只會執行它自己的代碼。

+0

感謝您的詳細回覆。我同時讓它工作,但會審查整體設計,具體針對您列出的可能風險。 – Frans 2012-08-03 17:07:25

+0

很酷。此外,如果您之前沒有看到過,請稍微注意相關說明,查看「打開/關閉」原則:http://en.wikipedia.org/wiki/Open/closed_principle – occulus 2012-08-04 11:15:22

0

可以添加可變超類(BOOL類型,如樣品)中的基類的初始化定義它和在子類的初始化重新定義。所以你總是可以確定方法是否從子類調用。

相關問題