使用繼承作爲重用代碼的一種方式有什麼缺點?使用繼承作爲重用代碼的一種方式有什麼缺點?
回答
使用繼承實現代碼重用從具有以下問題:
你不能在運行時改變重用行爲。繼承是編譯時依賴性,因此,如果一個
GameClient
類從TCPSocket
繼承重用connect()
和write()
成員函數,它具有TCP功能的硬編碼。你不能在運行時改變它。不能取代來自外部的重複使用性能進行測試的緣故。如果一個
GameClient
類繼承自TCPSocket
,以至於得到write()
(用於將數據寫入套接字),則不能從外部交換此代碼。你不能插入一個不同的write()函數來記錄所有要寫入文件的數據。你是依賴於所有,但最簡單的應用多重繼承。這爲diamond shaped inheritance trees打開了大門,這會增加代碼複雜度。
喜歡使用繼承的組合來重用代碼可以避免所有這些問題。
它需要繼承(用於反射它),這是僅適用於代碼許多可能的結構中的一種。這就是爲什麼我們有程序編程,函數式編程,面向對象編程,面向方面編程,聲明式編程等。請參閱programming paradigms。
IIRC,所述里氏替換原則1)假定,一個人應該能夠通過任何其派生類的替代的類;也就是說,派生類不應該表現出與它們的基類所建立的契約完全不同的行爲,或者違反其基類設立的契約。
顯然,這個原則對如何(基)類可以被另一個類(從它派生出來)「重用」提出了有意的限制。其他使用類的方法,如聚合或合成,不受原理的限制。
1)參見例如The Liskov Substitution Principle(指向PDF文檔的鏈接)。
使用繼承意味着當您在同一個類中調用一個方法(或C++中的虛擬方法)時,您可能實際上正在調用一個子類的方法並不是很清楚。可能導致的代碼異味是在類層次結構中上下移動的調用堆棧,這實際上意味着您的超類和子類處於循環依賴狀態。
使用組合和接口清楚地表明存在多種可能的實現,並且在存在循環依賴(通常應該被刪除)時也很明顯。 (由於一些原因(假設您通過構造函數使用類的傳遞依賴關係),構造使循環依賴顯而易見)。如果A和B相互依賴,那麼A構造B並且將this
或self
傳遞給B的構造函數,這是一個循環依賴的明確標誌,或者其他一些類構造A和B,A變得不可能,因爲A要求B先構建,而B需要先構建A)。
如果使用繼承,則會將其綁定到可變狀態的面向對象的範例中。如果您嘗試使用不可變對象,您最終會寫[僞代碼]
class A (int X, int Y)
def self.nextX(int nextX) = A(newX, self.Y)
class B (int X, int Y, int Z) extends A(X, Y)
def self.nextX(int nextX) = B(newX, self.Y, self.Z)
並且沒有代碼重用。因此,你使用可變對象,併發生瘋狂:)。
- 1. 是否有某種方式不重複的代碼繼承類
- 2. 在數據庫中使用繼承有什麼優點和缺點
- 3. 模擬XAML代碼繼承的最佳方式是什麼?
- 4. 「繼承」屬性:它有什麼作用?
- 5. 爲什麼這行代碼以這種方式工作?
- 6. 爲什麼使用Javascript原型繼承?
- 7. 爲什麼用這種方式輸出這段代碼?
- 8. python類繼承代碼重用
- 9. 使用Maven有什麼優點/缺點?
- 10. 類繼承代碼不起作用
- 11. 在python爲什麼超級行爲這種方式與多繼承?
- 12. 使用AJAX作爲RIA有什麼缺點嗎?
- 13. 使用PHP數據庫類作爲單例有什麼缺點?
- 14. 爲什麼不繼承我認爲它應該工作的方式工作?
- 15. 爲什麼雅虎CSS重置使用「字體:繼承」
- 16. 爲什麼不推薦使用多重繼承?
- 17. C++繼承 - 爲什麼我的函數沒有被使用?
- 18. 使用translate來代替標點符號,這三種方式有什麼區別?
- 19. 如何重用沒有多繼承的代碼?
- 20. Fowler空對象模式:爲什麼使用繼承?
- 21. Java爲什麼我不能使用具有功能接口的多重繼承
- 22. 這個繼承的java代碼有什麼錯誤?
- 23. 將其中一種異步方法重寫爲使用承諾的一種
- 24. 使用電子郵件作爲用戶名有什麼優點和缺點?
- 25. 使用android有什麼缺點:largeHeap =「true」?
- 26. 使用SOAP服務有什麼缺點?
- 27. 使用git-svn有什麼優缺點?
- 28. 使用SqlServer視圖有什麼缺點?
- 29. 使用AVL樹有什麼缺點?
- 30. 爲什麼有人會以這種方式使用ob_start,這有什麼意義?
是不是在你的教科書的某個地方? – Grumdrig 2010-07-20 21:06:10
當你想從多個類繼承功能,但是你的語言不支持多繼承時會發生什麼? – 2010-07-20 21:11:48
C++支持多種繼承 java支持使用接口 不知道其他人 – inglor 2010-07-20 21:13:45