检查继承类的具体类型

时间:2019-03-06 13:34:43

标签: c# oop class-design

假设我有几节课:

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);
    }
}

假设我在代码中MethodOneMethodTwo中包含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();
}

1 个答案:

答案 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作为参数。