2011-10-05 87 views
0

是否有能力將基類插入到繼承層次結構中? 下面是一個例子:在繼承層次結構中插入類(objective-c)

@interface BaseClass // has a lot of basic functionality and interface 
{...} 
@end 

@interface ChildClass : BaseClass // customizes BaseClass functionality 
{...} 
@end 

@interface BaseClassEx : BaseClass // add some features to base class 
{...} 
@end 

我希望有一個具有的所有方法從ChildClass而是從BaseClassEx

繼承

回答

0

聽起來像多重繼承。目標C沒有它。

根據你的描述,我會建議一個不同的設計模式。

@class BaseUtility // has a lot of basic functionality 
{...} 
@end 

@class BaseClass // has interface 
{...} 
@property BaseUtility *utility; 
@end 

@class ChildUtility : BaseUtility // customizes basic functionality 
{...} 
@end 

@class BaseClassEx : BaseClass // add some features to base class 
{...} 
@end 

現在你可以有四種東西。

  1. 一個BaseClass分配給它,它就像你的BaseClass。
  2. 分配給它的ChildUtility的BaseClass,就像你的ChildClass一樣。它獲得自定義的行爲,並具有與BaseClass相同的界面。
  3. 分配給它的BaseUtility的BaseClassEx,它與BaseClassEx相似。它有額外的功能(我假設的額外接口)。
  4. 分配給它的ChildUtility的BaseClassEx,它就像您想要的ChildClassEx一樣。它具有額外的功能和定製的功能。

類繼承是「是」的模式。上述結合了「是」一個模式和「有一個」模式。爲了得到你想要的ChildClassEx的效果,你做了「是」BaseClassEx,但是「有一個」ChildUtility。

+0

是的,我使用了這種解決方案:我聲明指向BaseUtility的指針,並在額外的init方法中初始化它。這有一些缺點,因爲BaseUtility需要訪問內部BaseClass數據。 – brigadir

+0

考慮將BaseUtility需要訪問的數據移動到BaseUtility中。 BaseUtility也可以有一些狀態。但是也許BaseClass也會想要訪問這些數據。有時您只需在其中一個或另一箇中爲數據創建訪問點。 – morningstar

0

爲什麼不直接從ChildClass繼承ChildClassEx?這繼承了所有超類的所有內容

@interface BaseClassEx : ChildClass // add some features... 
{...} 
@end 
+0

實際上我有兩個孩子班。那就是爲什麼如果我從子類繼承BaseClassEx,我需要複製它的代碼(BaseClassEx1,BaseClassEx2)。從設計的角度來看,這個解決方案並不「美觀」。 – brigadir

0

Objective-C上沒有多重繼承。但是,您可以使用幾種不同的模式來實現類似的效果。只要你BaseClassEx只增加了新的方法(而不是試圖重寫現有BaseClass的方法的行爲),最簡單的事情是聲明一個類

@interface BaseClass(BaseClassEx) 

// new method declarations 

@end 

@implementtion BaseClass(BaseClassEx) 

// new method definitions 

@end 

如果你這樣做,BaseClass的所有實例將有新的方法。這適用於任何現有的類,甚至像NSString這樣的東西。

+0

這會影響所有的課程。我不想改變BaseClass和ChildClass的行爲。 – brigadir