2012-06-15 67 views
0

(我認爲這是對OOP一個非常基本的問題,但遺憾的是我沒能找到它 - 所以,請關閉這個問題,如果它是一個dublicate)我應該繼承數組還是聲明它是一個成員?

我想創建一個類,主要用途其中一個是另一個類的對象數組的容器。用戶應該能夠像普通數組一樣容易地訪問這些對象 - 但是,在數組邏輯之上應該有自定義邏輯。

我應該從頭開始創建一個自定義類並使用標準數組類作爲成員,還是應該將子類標準數組類並將我的自定義邏輯包含到現有方法的重載以及新的方法中?

(我有客觀C的想法,但我不認爲它有很多與語言,所以我不包括在標籤)。

+0

我標記了這個問題Objective-C,因爲它是相當語言特定的。例如,你不能在Java中對數組進行子類化。你不能繼承Python列表或PHP數組。在C++中,數組根本不是對象(儘管STL有一個稱爲向量的動態數組數據結構)。 – paulmelnikow

+0

謝謝。但是,這聽起來像它仍然適用於各種語言,不僅Obj-C。 –

回答

2

如果你的課程尊重整個數組接口,無論它在你的上下文中,是的,你可以繼承它。如果你的「在數組邏輯之上的自定義邏輯」改變了數組接口的契約,你不應該繼承它。

如果您是Array的子​​類,那麼您的類可以看作是一個數組。一些不知道你的類的方法可以將它的一個實例視爲一個Array。這在多態性中扮演着重要角色。雖然你的類可以有「自定義邏輯」,但Array的接口不能被破壞。

注意:在通用上下文中回答,不針對任何語言,甚至不針對Array類。這對任何允許擴展的類都有效。

1

...但在Objective-C NSArrayNSMutableArray中使用類集羣實現。他們不是具體的類,而你可以子類,然後你必須實現自己的存儲,並提供自己的實現-count-objectAtIndex:

所以處理像你所描述的情況的首選方式是組合 - 實例變量或屬性 - 而不是子類。

如果您需要您的班級響應所有數組方法,您可以使用-forwardInvocation:(如here所述)將消息傳遞給數組實例。

相關問題