我有一个用于类的接口,该接口的功能应根据使用函数的类的状态(枚举)而有所不同。
public class Test : Interface
{
Enum state = Enum.s1;
int test = 0
public void fn1(int x)
{
switch(state)
{
case Enum.s1:
{
test += x;
break;
}
...
}
}
public void fn2(int x, ref int y)
{
switch (state)
{
case Enum.s1:
{
y += x*test;
break;
}
...
}
}
public bool fn3()
{
switch (state)
{
case Enum.s1:
{
return DoStuff(test);
break;
}
...
}
}
}
是否可以进行单个评估并将其用于所有功能?
我是代表的新手,但是为状态为fn1 / fn2 / fn3的代表创建一个代表,并在每次状态更改时使用所需的函数填充它们,也许是一个很好的解决方案?
我问,因为我认为对此有更好的解决方案。
谢谢您的帮助:)
我有一个用于类的接口,该接口的功能应根据使用函数的类的状态(枚举)而有所不同。
是否可以进行单个评估并将其用于所有功能?
是和否
No,使用Enum和控件结构不可能更好地解决它。投入到开关/案例中的枚举已经是您可以在代码中完成的最少工作。
是,可以做得更好。您这里应该没有的不是1在枚举值上表现不同的实现。您应该一直为此接口使用3种不同的实现]
一堆函数的行为不同,它们都引用相同的东西?这就是在继承期间进行重写的目的!
可能只有一种奇怪的情况,也就是说,如果您需要能够change在状态之间进行枚举/转换。由于使用一个实例初始化另一个实例的能力,这也不是什么大问题。
看看List<T>
class constructors。其中之一将IEnumerable<T>
作为输入。所有通用集合都实现该接口,甚至数组也隐式地覆盖为一个(实际上,每次使用foreach循环时都会发生这种情况)。因此它们都可以互相用作初始化程序。它还有一个ToArray()
function。
我可能发誓一些流类可以将其他流作为构造函数参数。一种将流相互封装的简单方法。但是找不到它。无论如何,大多数都将Byte[]
作为C-tor参数。并且它们都可以表示/隐式转换为Byte[]
。奇怪的是,这种行为甚至没有在抽象基类中定义。这只是大多数继承者所做的。
编辑:同样,如果您仍然需要其他代码的Enum值:一个只读属性。与普通字段不同,可以将它们添加到接口。而且每个实现都可以返回不同的硬编码值。