Наследование в зависимости от вычисляемого атрибута - PullRequest
0 голосов
/ 23 января 2020

Я сейчас работаю над небольшим проектом (C#), где у меня есть данные для анализа. Для этого я передаю данные в конструктор класса.

Класс выполняет первый анализ данных, и определенное значение определяется с использованием данных. Используя это значение, я могу сказать, что эти данные имеют тип B, C, D, ... и анализ будет продолжен в другом классе, соответствующем типу данных.

Это будет его представление диаграммы класса :

enter image description here

Таким образом, класс «данных» должен абстрагироваться, но не на самом деле? ¯ \ _ (ツ) _ / ¯

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

Спасибо за помощь.

1 Ответ

0 голосов
/ 24 января 2020

Если я вас правильно понимаю, вы хотите, чтобы базовый класс определял, какой дочерний класс создать, основываясь на данных, переданных в конструктор. Если это так, вы не можете сделать это таким образом - класс не может изменить себя, чтобы быть другим / производным типом при создании.

Я предполагаю, что все типы данных имеют некоторые общие свойства, и поэтому вы решили положить эти общие свойства в базовом классе. Я также предполагаю, что вы не хотите, чтобы у каждого дочернего класса данных был избыточный код, устанавливающий эти общие свойства в базовом классе. Вы достигаете sh того, что дочерний класс вызывает метод в базовом классе, передавая данные. Вы можете сделать это в конструкторах, если вы будете sh. Например:

class BaseData
{
    BaseData(Dictionary<string,string> data)
    {
        this.CommonProp1 = data["CommonProp1"];
        this.CommonProp2 = data["CommonProp2"];
    }

    public string CommonProp1 { get; set; }
    public string CommonProp2 { get; set; }
}

class DataTypeA : BaseData
{
    DataTypeA(Dictionary<string,string> data)
        : base(data) // <-- magic here
    {
        this.TypeA_Prop1 = data["TypeA_Prop1"];
        this.TypeA_Prop2 = data["TypeA_Prop2"];
    }

    public string TypeA_Prop1 { get; set; }
    public string TypeA_Prop2 { get; set; }
}

Я полагаю, что фабричный шаблон - это то, что вам нужно, поскольку вы хотите создать экземпляр класса, в котором тип определяется во время выполнения. Здесь вы инкапсулируете код, который определяет тип создаваемого дочернего класса. Что-то вроде:

class DataFactory
{
    public static BaseData BuildDataClass(byte[] serializedData)
    {
        Dictionary<string,string> data = ParseData(serializedData);
        switch (data["DataType"])
        {
            case "TypeA":
                return new DataTypeA(data);

            default:
                return null;
        }
    }

    private static Dictionary<string,string> ParseData(byte[] serializedData)
    {
        var data = new Dictionary<string, string>();

        // bla bla

        return data;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...