同一架构中的不同继承类型

Posted

技术标签:

【中文标题】同一架构中的不同继承类型【英文标题】:Different inheritance types in the same schema 【发布时间】:2011-06-08 09:29:09 【问题描述】:

我在 symfony 项目中使用 Doctrine 1.2, 我正在考虑在我的模式中混合具体和列聚合继承类型: 列聚合让我可以在父表中查询并获取父记录和子记录,而具体的继承让我获得更清晰的架构。 另外,混合将在同一个继承链中。 我将如何编写模式文件?喜欢下面的?

A:

B:
  inheritance:
    extends: A
    type: concrete

C:
  inheritance:
    extends: B
    type: column_aggregation
    keyField:         type
    keyValue:         1

或者像这样:

A:

B:
  inheritance:
    extends: A
    type: concrete

C:
  inheritance:
    extends: B
    type: concrete
D:
  inheritance:
    extends: C
    type: column_aggregation
    keyField:         type
    keyValue:         1


E:
  inheritance:
    extends: C
    type: column_aggregation
    keyField:         type
    keyValue:         2

有什么危险/注意事项吗?

【问题讨论】:

看起来没有其他人有经验可以分享。不过我很想知道这是怎么回事——我最初的想法是它不会很好用。 @benlumley 好吧,我们已经尝试过了,我们正在测试,目前它似乎工作得很好。如果我们遇到一些问题,我会编辑我的帖子并添加评论。我们尝试了架构的第二个版本。 @greg0ire:当涉及到具体继承时,请注意关系 :-) 确保您没有在基表上定义它们。我从来没有在任何程度上混合和匹配,所以很想听到你遇到的任何问题...... @prodigitalson:你能详细说明一下吗?为什么继承关系是危险的?因为国外的别名。我会在这里发布我遇到的任何问题(包括这个问题,如果它是一个)。 @greg0ire:因为有了具体继承,基表 (A) 已创建但未使用。如果您有指向A 的外键,则键检查将失败,因为数据实际上存储在B 中。只要您将关系保留在聚合表上,您就应该没问题。但在某些情况下,这会破坏以 A 开头的目的。 【参考方案1】:

只要你避免循环继承或菱形继承,你就可以使用它

一个循环继承(显然如下

A 类扩展 B B 类扩展 A

A 类扩展 C

B 类扩展 A

C 类扩展 A

Diamond 形状的继承更加圆润。当发生以下类型的情况时会发生这种情况

A类

B 类扩展 A

C 类扩展 A

D 类扩展 B、C

【讨论】:

您是说多继承可以通过教义实现吗?由于它不是 php,我对此表示怀疑......虽然词汇量 +1 我想说的是,只要这些约束不存在。我们可以安全地进行继承。

以上是关于同一架构中的不同继承类型的主要内容,如果未能解决你的问题,请参考以下文章

ES5和ES6中继承的不同之处

非 Diamond 类型中的虚拟继承

面向对象:封装继承和多态接口

重写super关键字final关键字多态子类型转换抽象的初步了解

面向对象编程的三个特性理解

如何创建从同一类继承的不同对象的向量?