保持范围变化的类型
我有一个简单的代码位,我想根据某些数据设置一个类型,但是我无法在手前声明它,因为我不知道它将设置为何种类型:保持范围变化的类型
if(data[i].on == true){
Type1 temp = (Type1)data[i];
} else {
Type2 temp = (Type2)data[i];
}
// scope lost
temp.call();
我该如何保持范围?这有点令人困惑,因为我不知道我需要在if else语句之前设置temp
。
C#是否有解决方案?
我想使.CALL()在类型1作为虚拟方法,和在类型2覆盖它,在范围的对象将是从类型1
基地:
class VirtualBase
{
public virtual void Call()
{
Console.WriteLine("This is base Call");
}
}
儿童:
class VirtualChild : VirtualBase
{
public override void Call()
{
Console.WriteLine("Child Call");
}
}
呼叫
VirtualTest.VirtualBase vc = new VirtualTest.VirtualChild();
vc.Call();
输出:
儿童呼叫
只有在'Type2'中的'call'必须做一些不同的事情时,我们没有任何信息。 – Andrew
如果'Type2'中的'call'没有做任何不同的事情,他不需要声明它。它会自动调用基地中的一个,结果将是“这是基地调用” –
一个可能的解决办法是dynamic object。
dynamic temp;
if(data[i].on == true){
temp = (Type1)data[i];
} else {
temp = (Type2)data[i];
}
temp.call(); //will work only if both the Type1 and Type2 have call method
我不会推荐这个,它不反映开发人员的意图,它可以在代码稍微改变后的未来失败。 – Andrew
你有Type1,Type2的接口吗? –
他们继承,但即时通讯不使用接口。 Type2继承了type1,因此.call()将始终有效。他们都继承了一个基类。 – Sir
如果他们都有call(),那么在检查之前将变量声明为null,并使用接口或基类。如果这是不可能的,那么使用一个像Action这样的委托,并在创建类型时分配它。 –