将XML对象解析为具有不同逻辑的多个类

时间:2018-10-30 08:51:19

标签: c# polymorphism

我有很多由第三方生成的XML节点:

<node id='8440' name='nodeOne' property_two='7.22' sorting_index='20'/>
<node id='8440' name='nodeTwo' property_two='7.22' sorting_index='subItemThree;30;subItemTwenty;50'/>
...

除一个名为 sorting_index 的节点外,所有节点中的每个属性都具有相同的类型和含义。通常,它包含一个int,它很好地指示了对象的排序索引。在上面的第一个节点中,名为“ nodeOne”的对象的排序索引为20。

不幸的是,有时那些节点只是多个子对象的排序索引的“载体”。查看上面给出的第二个节点,我们可以看到它为名为“ subItemThree”和“ subItemTwenty”的对象分别提供了值30和50的排序索引。

在我的方法中,我创建了两个类,第一类是具有简单sorting_index的节点的表示,第二类是具有复杂sorting_index逻辑的节点的表示。第二个类扩展了第一个类,并添加了一种从 SortingIndex 属性的getter提取排序指标数组的方法。 因此,我要做的是将所有内容解析为基类( SortingIndex 属性为string类型),然后将其中一些转换为派生类。我已经在另一个问题中描述了其背后的逻辑:Converting from base to derived object while having a huge constructor definition

但是,有人告诉我,进行这种转换不是一种好的设计方法。您有什么建议?我觉得有两个完全独立的类,除了一个属性外,它们具有完全相同的逻辑,这是一个过大的杀手。

1 个答案:

答案 0 :(得分:0)

一个人是否应该继承另一个人,应该考虑派生类是否可以替代基类,请参见Liskov substitution principle

如果不是,您可以使用具有除排序索引以外的所有属性的通用基类尝试类似的操作。

public abstract class BaseClass
{
    public string Property1 { get; }
    public int Property2 { get; }

    public BaseClass(string prop1, int prop2)
    {
        ...
    }
}

public class StringClass : BaseClass
{
    public int SortIndex { get; }

    public StringClass(string prop1, int prop2, int index) :
        base(prop1, prop2)
    {
        SortIndex = index;
    }
}

public class CollectionClass : BaseClass
{
    public Dictionary<string, int>  SortIndexes { get;}

    public CollectionClass(string prop1, int prop2, Dictionary<string, int> indexes) :
        base(prop1, prop2)
    {
        SortIndexes = indexes;
    }
}