使用繼承作爲重用代碼的一種方式有什麼缺點?使用繼承作爲重用代碼的一種方式有什麼缺點?
回答
使用繼承實現代碼重用從具有以下問題:
你不能在運行時改變重用行爲。繼承是編譯時依賴性,因此,如果一個
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. 在數據庫中使用繼承有什麼優點和缺點
- 4. 模擬XAML代碼繼承的最佳方式是什麼?
- 5. 繼承junit測試課有什麼優點和缺點?
- 6. C++爲什麼繼承不起作用?
- 7. 爲什麼在這種情況下繼承Event不起作用?
- 8. 「繼承」屬性:它有什麼作用?
- 9. 繼承僅用於代碼重用C++
- 10. 繼承代碼的可重用
- 11. 接口(作爲多重繼承的替代品)如何實現代碼重用
- 12. 爲什麼用這種方式輸出這段代碼?
- 13. 爲什麼使用Javascript原型繼承?
- 14. 爲什麼不繼承使用值?
- 15. 爲什麼這行代碼以這種方式工作?
- 16. 爲什麼使用繼承的外鍵不起作用?
- 17. 爲什麼這種繼承失敗(父類的方法是使用)C++
- 18. 爲什麼不用只有一個虛擬繼承的鑽石繼承?
- 19. XAML繼承,代碼重用,優化
- 20. python類繼承代碼重用
- 21. 爲什麼babel在繼承Object.create(superClass.prototype)時使用setProtoTypeOf來繼承?
- 22. 啓用ARC的Threaded Obj-C代碼 - 爲什麼它以這種方式工作?
- 23. 使用Maven有什麼優點/缺點?
- 24. 沒有多重繼承且沒有代碼複製的多重繼承
- 25. Python支持多重繼承的有限形式。以什麼方式有限?
- 26. 爲什麼boost :: scoped_ptr在繼承方案中不起作用?
- 27. 類繼承代碼不起作用
- 28. 什麼是避免這種重複代碼的最佳方式
- 29. 爲什麼這段代碼不起作用? (C++ OOP)公共繼承
- 30. 在python爲什麼超級行爲這種方式與多繼承?
是不是在你的教科書的某個地方? – Grumdrig 2010-07-20 21:06:10
當你想從多個類繼承功能,但是你的語言不支持多繼承時會發生什麼? – 2010-07-20 21:11:48
C++支持多種繼承 java支持使用接口 不知道其他人 – inglor 2010-07-20 21:13:45