我有不同的自定义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
}
答案 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.