检查继承类的具体类型

问题描述 投票:0回答:1

假设我有几个课程:

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();
}
c# oop class-design
1个回答
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作为参数。

© www.soinside.com 2019 - 2024. All rights reserved.