2010-07-20 53 views
4

使用繼承作爲重用代碼的一種方式有什麼缺點?使用繼承作爲重用代碼的一種方式有什麼缺點?

+7

是不是在你的教科書的某個地方? – Grumdrig 2010-07-20 21:06:10

+1

當你想從多個類繼承功能,但是你的語言不支持多繼承時會發生什麼? – 2010-07-20 21:11:48

+0

C++支持多種繼承 java支持使用接口 不知道其他人 – inglor 2010-07-20 21:13:45

回答

6

使用繼承實現代碼重用從具有以下問題:

  1. 你不能在運行時改變重用行爲。繼承是編譯時依賴性,因此,如果一個GameClient類從TCPSocket繼承重用connect()write()成員函數,它具有TCP功能的硬編碼。你不能在運行時改變它。

  2. 不能取代來自外部的重複使用性能進行測試的緣故。如果一個GameClient類繼承自TCPSocket,以至於得到write()(用於將數據寫入套接字),則不能從外部交換此代碼。你不能插入一個不同的write()函數來記錄所有要寫入文件的數據。

  3. 你是依賴於所有,但最簡單的應用多重繼承。這爲diamond shaped inheritance trees打開了大門,這會增加代碼複雜度。

喜歡使用繼承的組合來重用代碼可以避免所有這些問題。

0

它需要繼承(用於反射它),這是僅適用於代碼許多可能的結構中的一種。這就是爲什麼我們有程序編程,函數式編程,面向對象編程,面向方面編程,聲明式編程等。請參閱programming paradigms

6

IIRC,所述里氏替換原則1)假定,一個人應該能夠通過任何其派生類的替代的類;也就是說,派生類不應該表現出與它們的基類所建立的契約完全不同的行爲,或者違反其基類設立的契約。

顯然,這個原則對如何(基)類可以被另一個類(從它派生出來)「重用」提出了有意的限制。其他使用類的方法,如聚合或合成,不受原理的限制。


1)參見例如The Liskov Substitution Principle(指向PDF文檔的鏈接)。

3

使用繼承意味着當您在同一個類中調用一個方法(或C++中的虛擬方法)時,您可能實際上正在調用一個子類的方法並不是很清楚。可能導致的代碼異味是在類層次結構中上下移動的調用堆棧,這實際上意味着您的超類和子類處於循環依賴狀態。

使用組合和接口清楚地表明存在多種可能的實現,並且在存在循環依賴(通常應該被刪除)時也很明顯。 (由於一些原因(假設您通過構造函數使用類的傳遞依賴關係),構造使循環依賴顯而易見)。如果A和B相互依賴,那麼A構造B並且將thisself傳遞給B的構造函數,這是一個循環依賴的明確標誌,或者其他一些類構造A和B,A變得不可能,因爲A要求B先構建,而B需要先構建A)。

0

如果使用繼承,則會將其綁定到可變狀態的面向對象的範例中。如果您嘗試使用不可變對象,您最終會寫[僞代碼]

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) 

並且沒有代碼重用。因此,你使用可變對象,併發生瘋狂:)。

相關問題