假设我有几个课程:
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();
}
好像你想在运行时通过切换实际类型来指示使用哪种行为,这就是多态性的含义。
您不需要接口,因为您已经拥有一个公共基类。所以只需将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
作为参数。