继承取决于计算的属性

时间:2020-01-23 20:28:45

标签: c# class inheritance design-patterns

我目前正在研究一个小型项目(C#),其中有我要分析的数据。 为此,我将数据传递到类的构造函数中。

该类首先对数据进行分析,并使用数据确定某个值。使用此值,我可以说此数据是B,C,D,...类型,并且分析将在与该数据类型相对应的另一个类中继续进行。

这就是它的类图表示形式:

enter image description here

那么“数据”类应该抽象但不是真的? ¯\ _(ツ)_ /¯

我对工厂设计模式做了一些研究,但是我认为这并不是我真正想要实现的目标。可能还有其他我想要做的设计模式吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,则希望基类根据传递给构造函数的数据来确定要创建哪个子类。如果是这样,您就不能那样做-在构造类时,类不能将自身更改为其他类型。

我假设所有数据类型都具有某些公共属性,因此您决定将这些公共属性放在基类中。我还假设您不希望每个数据类型的子类都具有在基类中设置这些公共属性的冗余代码。您可以通过让子类在基类中调用方法并传递数据来实现这一点。您可以根据需要在构造函数中执行此操作。例如:

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