【问题标题】:Is it better to implement two classes or one class in the following case?在以下情况下实现两个类还是一个类更好?
【发布时间】:2020-12-26 06:27:17
【问题描述】:

我有一个具有 4 个属性的类“Vertex”和一个具有一个属性的类“Vertex_”。 Vertex_ 中的一个属性也在 Vertex 中。保留这两个类是一个好的设计,还是只对 Vertex 类进行编程更好,尽管当我实例化一个只需要一个属性的对象时,会有 3 个变量未使用?

【问题讨论】:

  • 我强烈建议在代码中或者在上面的问题中提出一个比“Vertex_”更有意义的名称。它还有助于了解问题背后的真实语义,了解属性的含义。默认情况下,它似乎是一个继承,但我们也有一个称为“组合优于继承”的规则,它可能会被应用或不被应用。
  • @pcjuzer 感谢您的评论。在 Vertex 中,我有以下属性: Edges:List, isStarter:bool, weight:int 和前辈:Vertex。在 Vertex_ 我有属性 Edges:List。你会推荐什么?
  • 是的,根据这些信息,继承似乎在这里有效。我建议以其他方式命名“Vertex_”,也许是“SimpleVertex”。

标签: class oop object design-patterns


【解决方案1】:

TL;DR

这个问题值得很长的回答。继承有两个原因,这样做的原因可能取决于所使用的语言。原因之一是代码重用。在不了解您的情况的情况下,您似乎只是为了重用属性而继承(但我怀疑您可能会重用更多属性)。但是,还有其他方法可以在没有继承的情况下获得代码重用,例如包含,这通常是更好的方法。

面向对象编程的一个强大功能是能够用一种类型的对象替换另一种类型的对象。当消息发送到该对象时,会根据接收消息的对象的实际类型调用正确的方法实现。这是一种多态。但是在某些语言中,用一个对象替换另一个对象的能力受到限制。在 Java 中,如果BA 的后代,我只能用B 类的实例替换A 类的实例。因此继承在 Java 中变得很重要,以支持多态性。

但是,能够将B 实例替换为A 实例意味着什么?它会起作用吗? A 类已经建立了一个契约,说明它的每个方法在您成功调用它之前需要什么,同时说明每个方法承诺提供什么。 B 类的方法会遵守那个约定吗?如果没有,你真的不能用B 代替A 并期望程序正确运行。 B 可能是A子类,但它不是A子类型(参见Liskov substitution principle])。

在 Python 等语言中,多态性不需要继承,编码人员更倾向于将其用作代码重用机制。然而,有些人认为子类化应该只用于表达子类型化。因此,如果Vertex_ 仅使用它继承的四个属性之一,我怀疑Vertex_ 的实例是否可以安全地替换Vertex 的实例。除非语言是C++,否则我不会进行继承,然后我会使用私有继承。

【讨论】:

    【解决方案2】:

    Class Vertex_ 实际上是 Class Vertex 的复制品。

    我建议使用继承,让 Class Vertex 继承父 Class Vertex_ 的属性,同时拥有 Class Vertex_ 没有的其他 3 个属性。

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多