【问题标题】:Inheritance depending on calculated attribute继承取决于计算的属性
【发布时间】:2020-05-10 04:46:26
【问题描述】:

我目前正在从事一个小项目 (C#),我有数据要分析。 为此,我将数据传递给类的构造函数。

该类对数据进行第一次分析,并使用该数据确定某个值。使用这个值,我可以说这个数据属于 B、C、D 类……并且分析将在与数据类型对应的另一个类中继续进行。

这将是它的类图表示:

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

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

感谢您的帮助。

【问题讨论】:

  • 是否可以显示您当前拥有的代码(或它的某种表示形式)?

标签: c# class inheritance design-patterns


【解决方案1】:

如果我理解正确,您希望基类根据传递给构造函数的数据来确定要创建的子类。如果是这样,您不能那样做 - 一个类在构造时不能将自己更改为不同/派生类型。

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

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

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2012-05-08
    相关资源
    最近更新 更多