Проверка конкретного типа наследующих классов - PullRequest
0 голосов
/ 06 марта 2019

Допустим, у меня есть пара классов:

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

Допустим, у меня есть предложение if внутриMethodOne и MethodTwo снова и снова в моем коде, как я могу сделать это чище?С помощью интерфейса я могу просто объявить одну переменную класса 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 Ответ

2 голосов
/ 06 марта 2019

Похоже, что вы хотите указать во время выполнения, какое поведение использовать, включив фактический тип, что и является полиморфизмом.

Вам не понадобится интерфейс, поскольку у вас уже есть общий базовый класс.Так что просто измените 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 в качестве параметра.

...