Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承取决于计算属性_C#_Class_Inheritance_Design Patterns - Fatal编程技术网

C# 继承取决于计算属性

C# 继承取决于计算属性,c#,class,inheritance,design-patterns,C#,Class,Inheritance,Design Patterns,我现在正在做一个小项目(C#),我有数据要分析。 为此,我将数据传递到类的构造函数中 该类首先对数据进行分析,并使用数据确定某个值。使用这个值,我可以说这个数据是类型B,C,D。。。分析将在与数据类型对应的另一个类中继续 这将是它的类图表示: 所以“数据”类应该是抽象的,而不是真正的?¯\_(ツ)_/“” 我对工厂设计模式做了一些研究,但我认为这并不是我真正想要实现的。是否有其他设计模式可以满足我的要求 感谢您的帮助。如果我理解正确,您希望基类根据传递到构造函数中的数据确定要创建的子类。如果是

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

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

这将是它的类图表示:

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

我对工厂设计模式做了一些研究,但我认为这并不是我真正想要实现的。是否有其他设计模式可以满足我的要求


感谢您的帮助。

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

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

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; }
}
类基本数据
{
基本数据(字典数据)
{
this.CommonProp1=数据[“CommonProp1”];
this.CommonProp2=数据[“CommonProp2”];
}
公共字符串CommonProp1{get;set;}
公共字符串CommonProp2{get;set;}
}
类DataTypeA:BaseData
{
数据类型A(字典数据)

:base(data)//是否可以显示您当前拥有的代码(或其某些表示形式)?
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;
    }
}