如何在不同类型的类型上调用共享成员?

时间:2009-12-02 18:01:18

标签: c# .net winforms design-patterns

我有不同的自定义Winforms控件集,所有这些控件都来自Control,例如:

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])

但是如何在运行时需要设置他们的Input属性。因此,如果用户切换到GraphPanel,我希望能够在将控件添加到表单后立即设置它的输入。

是否有设计模式或技术来解决这个问题?

编辑:每种输入类型(无方法)的属性如下:

CalculatorInput:
.Result
.LastOperation
...

GraphInput:
.Result
.SelectedNode
...

DisplayInput:
.Result
.CurrentColor
...

基本上这些输入只是绑定到适当UI的类型。因此,如果UI具有某些属性,则它们将绑定到这些输入,这就是为什么当我分配新输入时,UI将自动更新。

EDIT2:

所以这些输入都是独立的,没有继承等等。

但是在适当的推出中定义如下:

class CalculatorPanel
{
    CalculatorInput Input
}

class GraphPanel
{
    GraphInput Input
}

class DisplayPanel
{
    DisplayInput Input
}

2 个答案:

答案 0 :(得分: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 :(得分:0)

由于输入本质上是分开的,因此它们可以为少量的常用功能实现一个接口,但它可能无法实现太多(这将有助于了解输入类成员的数据类型)。要访问非常见功能(大多数输入对象),您仍然需要额外的逻辑来使事情正常工作:

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