簡體   English   中英

業務對象集合是否應從Collection繼承 <T> 什么時候不延長呢?

[英]Should a business object collection inherit from Collection<T> when it doesn't extend it?

我有一個從Collection繼承的業務對象集合(表示來自數據庫的數據),並且有一個靜態方法調用存儲過程,然后用返回的數據填充其屬性。

我的問題是; 繼承Collection是不對的,因為它沒有真正擴展類? 或者更好的是不從任何東西繼承,而是維護一個類型為Collection的私有變量?

如果您的業務對象可以向世界提供通常的收集方法,那么從Collection<T>繼承就可以了。 而且我猜,事實上你添加了一些東西 - 你指定T

UDATE:
根據作者的評論,發布所有收集方法會使對象可編輯,這是不可接受的。 因此,不是繼承,而是創建私有字段並使類可枚舉。

如果沒有詳細了解你想要做什么,很難給出答案。 但是,我通常不會繼承Collection,因為它沒有真正提供足夠的虛擬方法來覆蓋。 這可能會改變你班級的行為,將來有點棘手。

繼承的麻煩在於,如果你使用它,你將永遠陷入Collection基類的行為,或者面臨復雜的重構。 例如,您可能希望添加過濾,搜索和排序操作,此時您需要切換到Collection from Collection。 您甚至可能希望在需要BindingList而不是Collection的情況下進行數據綁定。

另一個計划是繼承ICollection或更好的IList <T>,然后委托給私人Collection成員。 這為您提供了最大程度的控制,允許您在不影響公共界面的情況下更改類的內部表示。 這樣做的問題是開發類需要更長的時間。

因此,您面臨的是在更快的開發和未來的靈活性之間進行權衡,正如我在開始時所說的那樣,從原始帖子中給出的信息來判斷哪條路可能有點困難。

PS:要使IList <T>實現為只讀,只需從IsReadOnly返回true,然后從改變列表的所有方法中拋出NotSupportedException。

實際上,最“純粹”的方法是在繼承對象時添加任何內容。 幾乎沒有人試圖做到那么純粹,但這被認為更純粹。 我們的想法是,您可能會覆蓋某些方法來“填補空白”,了解您的對象的行為方式,但您不會添加任何非私有成員。

我並不主張嘗試那么純潔。 關鍵是,你所做的不是以任何方式“不純潔”。 (注意:在使用函數式語言的意義上,我根本不使用“純”和“不純”。簡單來說就是詞典定義的一般意義)。

是的,這是錯的。 你應該只有一個對象來回收集合。 此外,除非有迫切的需要,否則不要將方法設置為靜態。 新的Blah()。foo()沒有錯。 任何體面的JIT都將內聯對象創建。

此外,我認為在99%的情況下擴展Collection是錯誤的:)通常,當人們擴展Collection時,他們真正應該做的只是組成一個List並僅暴露客戶真正需要的東西或只使用普通List。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM