2008-12-12 52 views
1

我知道 Prefer composition over inheritance 的迴應,並意識到組合優於繼承。你將如何設計沒有繼承的控制樹/層次結構?

但有些情況下,繼承確實有很好的作用。繼承層次結構的錯誤使用導致了與重用相關的所有問題。

採取以下控件的例子...

Button/Textbox/Combobox/ListBox/Grid etc. 

它們通常被實現爲

public class Control 
{ 
    ... 
} 


public abstract class TextBoxBase : control 
{ 
    .... 
} 

public class TextBox : TextBoxBase 
{ 
    .... 
} 

public abstract class ButtonBase: control 
{ 
    .... 
} 

public class Button: ButtonBase 
{ 
    .... 
} 


public class TextBox : TextBoxBase 
{ 
    .... 
} 


public class NumericTextBox: TextBox 
{ 
    .... 
} 

注意:無論是用戶界面和功能對於可重複使用。

我可能是錯的或部分正確的。你的想法只會幫助我提高對這個問題的理解。

您將如何設計控制模型/層次結構而不使用繼承,您認爲哪一個更好?

請考慮到易用性,以及此控件的IDE使用。

P.S:這個問題也受this question的啓發。

+0

您應該再次閱讀該問題。 OP沒有說沒有繼承,他說沒有基礎類。接口可以從其他接口繼承。所以Button將實現實現IControl的IButton。 – jmucchiello 2008-12-12 18:09:28

回答

2

首選組成不同於在任何情況下強制它。要添加到您的UI示例中,我會說Java和.NET都從使用流的繼承層次結構中受益。

我建議你看看Windows Presentation Foundation的繼承樹 - 但這是一個相對現代的用於構圖的UI工具箱。這使奇怪和美妙的東西 - 如按鈕,其中包含更多的按鈕等。有時(如在該例中)它將是無用的 - 但總體設計是強大的。

我並不是說我很理想 - 我也不會聲稱對WPF知之甚多 - 但這是一個有趣的起點。

我應該指出,即使在WPF中,繼承也被廣泛使用 - 但與WinForms中的方式並不完全相同。

+0

喬恩Skeet *是*理想,這是不完美的理想主義:P – Draemon 2008-12-12 17:50:16

0

當所有任務處於相同角色時,繼承性會更好。

+0

嘿,我希望我能投票評論。 – 2008-12-12 18:11:39

1

您將使用一系列代表傳統上在父類中的功能。假設Control類包含基本的繪圖函數(即paint()),那麼Control將成爲BasicControlDelegate或類似的,並且將使用對所有「繼承」功能使用BasicControlDelegate的引用來創建「子類」。

如果您想按原樣使用父/代理功能,則可在每個「子類」中創建一個paint()方法,該方法只調用委託上的相同方法。如果你想改變功能,你創建一個不同的實現。

TextBoxBase可能有一個paint()實現,它直接被TextBox使用,但也許NumericTextBox有它自己的paint()實現。

我覺得主要點是這些:

  • 繼承類似組合物,用隱式引用了「父對象」(只有一個真正的當然對象)。
  • 通過繼承,您可以默認繼承並公開每個公用方法,並且可以根據需要覆蓋它。
  • 隨着組合你默認沒有公開任何東西,並且必須包裝你想要公開的每個方法。