假设我有几节课:
public class BaseClass
{
//....
}
public class ChildClassA : BaseClass
{
//....
}
public class ChildClassB : BaseClass
{
//....
}
现在我还有另一个使用上述子类的类:
public class Program
{
private Type _type;
private ChildClassA _childA = GetChildClassA();
private ChildClassB _childB = GetChildClassB();
public void MethodOne()
{
if(_type == typeof(ChildClassA))
DoSomething(_childA);
else if(_type == typeof(ChildClassB))
DoSomething(_childB);
}
public void MethodTwo()
{
if(_type == typeof(ChildClassA))
DoSomething(_childA);
else if(_type == typeof(ChildClassB))
DoSomething(_childB);
}
}
假设我在代码中MethodOne
和MethodTwo
中包含if子句,该如何使它更整洁?使用接口,我可以声明一个类变量IBaseClass
并为其分配_childA
或_childB
。但是对于继承的类,这是不可能的。还有其他方法可以得到相同的结果吗?所以基本上我会得到这样的东西:
public class Program
{
private IBaseClass _child = GetChildClass();
public void MethodOne()
{
DoSomething(_child);
}
public void MethodTwo()
{
DoSomething(_child);
}
}
编辑:为澄清起见,我不能使用接口,因为所有类早就已经实现,因此重构它们将是一项艰巨的任务。所以我基本上是在寻找与基类和子类相似的东西。
EDIT2:这是我对HimBromBeere答案的评论的意思:
private void DoSomething(BaseClass baseC)
{
var childA = baseC as ChildClassA;
if (childA != null)
childA.DoSomethingA();
var childB = baseC as ChildClassB;
if(childA != null)
childB.DoSomethingB();
}
答案 0 :(得分:2)
似乎您想在运行时通过打开实际类型来指示要使用哪种行为,这就是多态性。
您将不需要接口,因为您已经拥有一个通用的基类。因此,只需将private IBaseClass _child = GetChildClass()
更改为private BaseClass _child = GetChildClass()
:
public class Program
{
private BaseClass _child = GetChildClass();
public void MethodOne()
{
DoSomething(_child);
}
public void MethodTwo()
{
DoSomething(_child);
}
}
这假设DoSomething
仅期望将BaseClass
作为参数。