实施 "Inheritance Square" 的最佳方式

Best way to implement an "Inheritance Square"

这是我的 class 图。

问题出在 AgendaInstance(见红点)。我正在尝试继承(重用)Agenda.Tasks 以包含它自己的任务,这些任务属于 TaskInstance 类型,是 Task.

的子类型

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

这里有我可以使用的设计模式来解决这个问题吗?我不想在 AgendaInstance 中隐藏(新)Tasks。这将破坏具有继承层次结构的目的。我的 midi-chlorians 告诉我有一个比直接处理序列化或绑定细节更好的解决方案;这是一个 "deeper" 问题,适合更根本的解决方案。我打算 fiddle 研究泛型,但也许你知道更好的方法或更好的模式。

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

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

现在层次结构中只有一个 Task 属性。但是,Agenda 需要实例化类型参数,所以以前的 "plain" Agenda 变成了 Agenda<Task>.

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

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

愿原力与你同在