2009-12-02 36 views
0

我有不同的組自定義的WinForms控制所有派生從控制如:如何在不同類型的類型上調用共享成員?

CalculatorPanel, GraphPanel, DisplayPanel, etc : Control 

我用一個單一的形式來顯示根據用戶想要看看這些集合中的一個或多個。

他們都擁有一個名爲成員:

Input 

其中類型是不同的,例如:

CalculatorInput, GraphInput, DisplayInput, etc. 

如何將它們存儲在一個列表或者一些其他集合在那裏我可以打電話Input屬性沒有任何問題?

我應該爲每個接口使用一個通用接口嗎?那麼它必須是通用的。我將如何指定類型?

現在,我使用這樣的添加/刪除控件:

Panels = Dictionary <Enum, Control> ... 
Panels.Add (PanelType.Calculator, new CalculatorInput().Controls); 
... 

所以後來我可以說:

Form.Add/RemoveControls (Panels[PanelType.Calculator]) 

,但我會如何設置自己的輸入屬性,當我需要在運行。因此,如果用戶切換到GraphPanel,我希望能夠在將其控件添加到窗體後將其設置爲輸入。

是否有設計模式或技術來解決這個問題?

編輯:分別輸入類型(沒有方法)的性質如下:

CalculatorInput: 
.Result 
.LastOperation 
... 

GraphInput: 
.Result 
.SelectedNode 
... 

DisplayInput: 
.Result 
.CurrentColor 
... 

基本上這些輸入都只是類型被綁定到適當的用戶界面。因此,如果UI具有某些屬性,它們將綁定到這些輸入,這就是爲什麼當我分配新輸入時,UI將自動更新。

EDIT2:

因此,所有這些投入是獨立的沒有繼承等

但在適當的推出定義如下:

class CalculatorPanel 
{ 
    CalculatorInput Input 
} 

class GraphPanel 
{ 
    GraphInput Input 
} 

class DisplayPanel 
{ 
    DisplayInput Input 
} 
+0

請您概述每個輸入類的屬性/方法嗎? – 2009-12-02 19:28:15

+0

好的,我添加了成員​​。 – 2009-12-02 20:05:49

+0

什麼版本的C#? – 2009-12-02 21:22:55

回答

2

我想你需要的是你輸入的接口,所有的類都將繼承..

public interface MyInputInterface 
{ 
     void YourInputFunction(); 
} 

public class CalculatorPanel : Control, MyInputInterface 
{ 
    .. 
    .. 

    void MyInputInterface.YourInputFunction() 
    { 
     // do your code specific to calculator panel here 
    } 
} 

public class GraphPanel : Control, MyInputInterface 
{ 
    .. 
    .. 

    void MyInputInterface.YourInputFunction() 
    { 
     // do your code specific to graph panel here 
    } 
} 

然後,您可以建立任何實現MyInputInterface

public List<MyInputInterface> MyInputList = new List<MyInputInterface>(); 

列表,並,如有必要,該名單工作...接口是任何對象的利用它來保證它有一個合同相關的屬性,字段,功能等。

+1

如果接口是明確實現的,那麼你需要轉換到該接口才能看到「YourInputFunction」。 – epitka 2009-12-02 19:00:19

+0

不,只是調用 - 在這種情況下,object.YourInputFunction。每個類的實現將知道如何根據自己的控制和環境行事......除非你正在返回一個通用的「對象」,這個對象將需要稍後投入使用。 List <>已經知道它是一個具有可用功能的控件。 – DRapp 2009-12-02 19:28:23

+0

如果你正在處理很多對象,它們將被分配到一個具有接口類型的變量。 – leppie 2009-12-02 20:09:59

0

由於輸入分離基本上,他們可以爲少量的通用功能實現一個接口,但它可能無法實現太多(這將有助於瞭解輸入類成員的數據類型)。要訪問非公共功能(這是大多數輸入對象的),你仍然需要額外的邏輯把事情的工作:

if (currentControl is CalculatorPanel) 
{ 
    CalculatorInput input = (currentControl as CalculatorPanel).Input; 
    // ... 
} 
else if (currentControl is GraphPanel) 
{ 
} 
etc.
+0

接口的指針是允許來自dispirit類型的通用調用機制的契約。爲什麼調用接口方法在這裏是一個糟糕的設計點。 – rerun 2009-12-02 18:58:06

+0

什麼是整個界面,它們顯然屬於同一個超類型,即「INPUT」。 – epitka 2009-12-02 19:01:33

+1

OP沒有說明輸入是否具有共同的功能,所以給定類別的名稱後,我認爲它們不會(計算器的輸入如何與圖形輸入類似?)。 – 2009-12-02 19:05:51