Обработка взаимодействия экземпляров классов принадлежит двум параллельным группам наследования - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть две группы классов в моем коде, и одна группа имеет логику, а другая группа имеет данные, и наследование также используется в каждой группе. Я попытался имитировать ситуацию, с которой я имею дело в приведенном ниже фрагменте кода. У меня проблема в том, как эффективно обрабатывать объекты производных классов данных в связанных экземплярах логических классов. Прямо сейчас я пытаюсь привести экземпляр производного класса данных в метод производного логического класса, который я не считаю логичным. Мне нужно некоторое руководство для решения этой проблемы.

void Main()
{
    var item1 = new D1();
    var holder1 = new DataHolder1() { localProp1 = "test" };
    var holderout = item1.Method1(holder1);
    holderout.Dump();

}



public class BaseDataHolder
{
    public string prop { get; set; }
}

public class DataHolder1 : BaseDataHolder
{
    public string localProp1 { get; set; }
}


public class DataHolder2 : BaseDataHolder
{
    public string localProp2 { get; set; }
}


public  class BaseClass
{
    public virtual BaseDataHolder Method1(BaseDataHolder holder)
    {
        return null;
    }
}

public class D1 : BaseClass
{
    public override BaseDataHolder Method1(BaseDataHolder holder)
    {
        (holder as DataHolder1).localProp1.Dump();
        (holder as DataHolder1).localProp1 = "change1";
        return holder;
    }
}

public class D2 : BaseClass
{
    public override BaseDataHolder Method1(BaseDataHolder holder)
    {
        (holder as DataHolder2).localProp2.Dump();
        (holder as DataHolder2).localProp2 = "change2";
        return holder;
    }
}

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Это нарушает принцип подстановки Лискова . Таким образом, это плохо , потому что ваша подпись обещает хорошо работать с любым BaseDataHolder, но на самом деле она просто рухнет, если будет введено неправильно BaseDataHolder.

Я не могу действительно дать решение, потому что мы не знаем ваших требований. Из того, что вы опубликовали, ваши три логических класса должны отбросить наследование и просто иметь три разные сигнатуры методов, каждый из которых говорит о том, что ему нужно, вместо того, чтобы все лгут о том, что им нужно, а затем случайно падает.

0 голосов
/ 02 ноября 2018

Я не понимаю, почему это было бы нелогично, поскольку похоже, что вы пытаетесь получить DataHolder1 всегда в классе D1. Скорее, почему ваш класс не может создавать с экземпляром класса Data и использовать его в методе, подобном

public class D1 : BaseClass
{
    private readonly DataHolder1 holder;

    public D1(DataHolder1 holder) { this.holder = holder; }

    public override BaseDataHolder Method1()
    {
        holder.localProp1.Dump();
        holder.localProp1 = "change1";
        return holder;
    }
}

Тогда вы можете просто сказать

var item1 = new D1(new DataHolder1());
BaseDataHolder data = item1.Method1();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...