实施 "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 研究泛型,但也许你知道更好的方法或更好的模式。
您可以使 Agenda
在 Task
上通用,如下所示:
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 仅用于序列化目的。例如:AgendaSerializable
,TaskSerializeable
作为任务。好处是:您可以保持继承和数据模型的清洁,同时您需要处理数据转换作为缺点。
愿原力与你同在
这是我的 class 图。
问题出在 AgendaInstance
(见红点)。我正在尝试继承(重用)Agenda.Tasks
以包含它自己的任务,这些任务属于 TaskInstance
类型,是 Task
.
我可以把this.Tasks.Add(new TaskInstance());
放在AgendaInstance
里面。该代码有效,但是当我尝试序列化或绑定时出现问题。由于 Tasks
静态绑定到 Task
所有被序列化(例如,到 xml)或绑定(例如,到网格行)的都是 Task
的属性,而不是TaskInstance
.
这里有我可以使用的设计模式来解决这个问题吗?我不想在 AgendaInstance
中隐藏(新)Tasks
。这将破坏具有继承层次结构的目的。我的 midi-chlorians 告诉我有一个比直接处理序列化或绑定细节更好的解决方案;这是一个 "deeper" 问题,适合更根本的解决方案。我打算 fiddle 研究泛型,但也许你知道更好的方法或更好的模式。
您可以使 Agenda
在 Task
上通用,如下所示:
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 仅用于序列化目的。例如:AgendaSerializable
,TaskSerializeable
作为任务。好处是:您可以保持继承和数据模型的清洁,同时您需要处理数据转换作为缺点。
愿原力与你同在