2017-08-02 53 views
1

背景

我創建具有由不同的節點類型和連接,以及情節可以從節點可以由曲線圖的GUI。添加方法到多個類具有不同的基類

inheritance tree看起來像這樣:

original inheritance tree

正如你所看到的,所有的圖形節點和情節是可移動的。繪圖和一些圖形節點可調整大小。現在,我想讓用戶能夠將所有圖形節點組合在一起,這些節點類型稱爲Network

network inheritance tree

所以我想添加一個名爲restrict所有非劇情類方法,儘管他們有不同的基類的事實。我聽說過

問題

一種方法是use mixins,但他們覺得自己大材小用。有沒有更簡單的方法來添加方法,從不同的基類繼承的類?在這種情況下,我怎樣才能將「組合性與繼承性」放在一起?

我不認爲我應該只加restrictComponent,因爲這會創建一個永遠不會被使用的無用方法,這就像一個不好的代碼味道。

我知道我可以使用Interfaces進行多重繼承,但Interfaces不會自動使用參考實現,因此我必須將一堆調用super複製到每個方法定義中。這感覺就像很多代碼重複。如果實現類沒有提供實現,是否有自動使用接口的參考實現的方法?

+0

混入可能是矯枉過正,你的情況,但它會給你在繼承的組成你提到的,以及沒有超級電話,你也提到。 Typescript現在完全支持mixin。我剛剛完成了實現打字稿混合,他們通過了最初的設置障礙後工作。 mixin會爲您提供您使用'自動'實現所需的那種繼承。 –

回答

2

我想發表評論,詢問有關您的情況的更多信息,以便我可以更好地準備答案,但我的信譽數額不允許它(雞蛋&雞蛋的情況阻止我構建一個更好的答案有更多的聲譽,發表評論...)所以這是我現在最好的答案,我可能會更新。

直覺上我認爲你的問題&解決方案非常概念化,一旦你解決了這個概念的問題,解決方案將不需要任何花哨的編碼。

如果我對自己在做什麼有更好的「真實世界」的想法,我相信我可以幫助想出一些代碼設計來實現它,但目前它是任意的「節點」等例如,你談論的這個「分組」的性質是什麼?

不知道別的,我有幾點建議;

  • 簡單地將PassthroughNode從ResizableComponent繼承的含義是什麼?在某些情況下,這可能會導致一個對象佔用比它需要更多的資源,但是如果它沒有增加太多,並且提供了您所追求的功能,並且是最簡單的更改,那麼這是一個可行的選項
  • You haven根本沒有提到「接口」,這讓我覺得你不知道它們,因爲它看起來正是你在這裏所需要的。Node和PassthroughNode都實現了「Groupable」接口,並且在內部有自己的如何使自己「可分組」的實現。
  • ,這可能是瘋狂的,但分量基礎類可以實現可分組行爲代替,那麼任何一個對象可以是可分組:)
+0

確實,從「ResizableComponent」繼承並覆蓋所有可調整大小的東西是一種選擇,但它並不是一個好的選擇。接口似乎是完整的「mixin」事情正在完成,但似乎仍需要代碼複製,因爲如何將外部函數定義爲實現這兩個接口?我提到了爲什麼我不喜歡最新編輯中的最後一個場景。 – Seanny123

+1

從來沒有聽說過mixins是誠實的。接口是一個更基本的面向對象的概念。的確,接口只是定義了可用函數的存根,並且在每個類文件中仍然需要實現。但是,您的目標是儘量減少代碼重複,而不是零容忍地根除它。您將首先使用組合,只有在絕對有用的情況下繼承,以及使對象更靈活的接口,並通過讓相同的代碼重用使用相同接口的對象來減少代碼重複。 – Domarius

+1

我通過經驗瞭解到,你會爲了避免任何和所有代碼重複而自殺,花費數小時的時間重新設計和重新編碼,每次遇到類似的代碼時,只需要吹噓你保存的10行代碼的代碼被複制。當你只重複一次代碼時,特別是當它不是很多時,如果它能夠保持開發進度,並且由於接口讓對象被相同的代碼使用而獲得更大的收益儘管它們可能會在內部複製一些代碼。 – Domarius

相關問題