实现“继承广场”的最佳方式

时间:2015-04-07 02:22:36

标签: c# inheritance

这是我的班级图。

enter image description here

问题出在AgendaInstance(参见红点)。我正在尝试继承(重用)Agenda.Tasks来包含自己的任务,类型为TaskInstance,子类型为Task

我可以将this.Tasks.Add(new TaskInstance());放在AgendaInstance内。该代码有效,但当我尝试序列化或绑定时,问题就出现了。由于Tasks静态绑定到Task所有被序列化(例如,到xml)或绑定(例如,到网格行)的是Task的属性,而不是{{1} }。

我可以使用这种设计模式来解决这个问题吗?我不想在TaskInstance中影子(新)Tasks。这将破坏拥有继承层次结构的目的。我的midi-chlorians告诉我,有一个解决方案比直接处理序列化或绑定细节更高;这是一个“更深层次”的问题,有助于实现更根本的解决方案。我打算用仿制药来捣乱,但也许你知道更好的方式或更好的模式。

2 个答案:

答案 0 :(得分:1)

我使用xml序列化的90%经验都很糟糕。它们倾向于破坏继承模型并且不支持接口。因此,它会导致您破解和修改现有类以适应序列化。在处理它时,XmlIgnore和重复的属性通常会出现。

因此,我通常只为序列化目的创建另一个类。例如:AgendaSerializableTaskSerializeable为任务。好处是:保持继承和数据模型的清洁,同时需要处理数据转换作为缺点。

可能是你的力量。

答案 1 :(得分:0)

您可以在AgendaTask通用,如下所示:

class Agenda<T> where T : Task {
    public IList<T> Tasks {get; private set;}
    ...
}
class AgendaInstance<TaskInstance> {
    ...
}

现在层次结构中只有一个Task属性。但是,Agenda需要实例化一个类型参数,所以过去常常是&#34; plain&#34; Agenda变为Agenda<Task>