规范化与多重继承
Normalization versus multiple inheritance
我必须模拟一种情况,在这种情况下我想使用专业化来确保 classes 在某种程度上标准化,但是:
- 存在多重继承问题的风险,尤其是长运行
- 需要从中导出一个符合XML的UML模型(a.o,只允许一个超级class)
简化情况如下(另见下图):我们有零件,如门、螺栓、轮子等,以及工具,如钻头、梯子和更大的机械。所有这些都可以用于通用流程,如订单、发货等。因此,我想要一个代表它们的 superclass(也许是 Powertype?),比如 Item。
工具和零件都有专门的 class 序列号。因此,我认为带有 SerialNumber 的 SerializedItem class(SerializedPart 和 SerializedTool 均继承)将确保我们拥有的所有序列化 'things' 至少携带相同的信息。但是,我还需要这些序列化项目至少携带与其更通用的部分相同的信息,因此我将引入多重继承。
我考虑过制作 Item classes 接口。这至少会减轻一些(很多,全部?)多重继承问题。然而,这就是 another 的用武之地:除了属性 SerialNumber 之外,我还想强制所有序列化专业化与制造商具有聚合关系。不允许聚合到接口,所以我觉得我不能与 superclass 的关系强制执行此关系。
因此,我有以下 considerations/problems:
- 有两个不相交的 'branches' 项目,对序列化专业化的内容几乎没有技术治理
- 项目 class 是接口,但几乎没有治理 w.r.t。通过序列化专业化使用制造商
- 所有具体的 classes,但是存在多重继承问题,在尝试派生 XML classes 时 必须 解决这些问题来自模特
您更喜欢哪个选项,为什么?我是否遗漏了任何注意事项?
我不会让 SerializedItem
成为超类。没有什么 是 序列化的东西,一般化意味着什么。事物可以符合序列化协议,这与实现接口(可能称为 Serializable
)相同。如果您碰巧处理可序列化的东西而不关心它们的内容,您只需处理 Serializable
并且只知道数字。
基本上你应该让你的 SerializedItem
成为一个接口(最终将它重命名为 Serializable
),移除向上的泛化并实现两个水平的。
这可能不是最后的比率。但对我来说,这种做法听起来更合理。
如果您想拥有一个(独立于平台的)信息设计模型(在本质上类似于概念模型),那么您应该使用多重继承,前提是这反映了您的问题域的概念。
根据这种基于模型的工程方法,您的模型是一个非常好的设计模型,可以用作制作(特定于平台的)实现模型的基础,例如 Java class 模型或 XML 架构模型。
要制作 XML 架构模型,您必须选择特定的映射。特别是,您需要选择一个映射来解决多重继承模式,另请参阅 。
我必须模拟一种情况,在这种情况下我想使用专业化来确保 classes 在某种程度上标准化,但是:
- 存在多重继承问题的风险,尤其是长运行
- 需要从中导出一个符合XML的UML模型(a.o,只允许一个超级class)
简化情况如下(另见下图):我们有零件,如门、螺栓、轮子等,以及工具,如钻头、梯子和更大的机械。所有这些都可以用于通用流程,如订单、发货等。因此,我想要一个代表它们的 superclass(也许是 Powertype?),比如 Item。
工具和零件都有专门的 class 序列号。因此,我认为带有 SerialNumber 的 SerializedItem class(SerializedPart 和 SerializedTool 均继承)将确保我们拥有的所有序列化 'things' 至少携带相同的信息。但是,我还需要这些序列化项目至少携带与其更通用的部分相同的信息,因此我将引入多重继承。
我考虑过制作 Item classes 接口。这至少会减轻一些(很多,全部?)多重继承问题。然而,这就是 another 的用武之地:除了属性 SerialNumber 之外,我还想强制所有序列化专业化与制造商具有聚合关系。不允许聚合到接口,所以我觉得我不能与 superclass 的关系强制执行此关系。
因此,我有以下 considerations/problems:
- 有两个不相交的 'branches' 项目,对序列化专业化的内容几乎没有技术治理
- 项目 class 是接口,但几乎没有治理 w.r.t。通过序列化专业化使用制造商
- 所有具体的 classes,但是存在多重继承问题,在尝试派生 XML classes 时 必须 解决这些问题来自模特
您更喜欢哪个选项,为什么?我是否遗漏了任何注意事项?
我不会让 SerializedItem
成为超类。没有什么 是 序列化的东西,一般化意味着什么。事物可以符合序列化协议,这与实现接口(可能称为 Serializable
)相同。如果您碰巧处理可序列化的东西而不关心它们的内容,您只需处理 Serializable
并且只知道数字。
基本上你应该让你的 SerializedItem
成为一个接口(最终将它重命名为 Serializable
),移除向上的泛化并实现两个水平的。
这可能不是最后的比率。但对我来说,这种做法听起来更合理。
如果您想拥有一个(独立于平台的)信息设计模型(在本质上类似于概念模型),那么您应该使用多重继承,前提是这反映了您的问题域的概念。
根据这种基于模型的工程方法,您的模型是一个非常好的设计模型,可以用作制作(特定于平台的)实现模型的基础,例如 Java class 模型或 XML 架构模型。
要制作 XML 架构模型,您必须选择特定的映射。特别是,您需要选择一个映射来解决多重继承模式,另请参阅 。