[英]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.