【问题标题】:Alternative to direct inheritance直接继承的替代方案
【发布时间】:2012-10-29 09:32:15
【问题描述】:

我有两个班级 class A 和 class B。我希望 class B 具有 class A 的功能以及更多自己的功能。一种非常简单的方法是从 class A 继承 class B。但由于某些实现特定的原因,我不能这样做。

我想到了另一种解决方案,我将在其中创建另一个包含所有虚函数的类 class C。 类 A 和 B 将继承自 类 C。 class A 将包含虚函数的实现,class B 也可以定义相同的函数集,因此 class B 将具有以下功能A 级。 这是最佳解决方案吗?除了直接从 class A 继承 class B 之外,还有其他更好的解决方案吗?

【问题讨论】:

  • “但由于某些实现特定的原因,我不能这样做” 不是一个好的但经常(滥用)用于糟糕设计的借口。如果您的设计需要继承使用它并且如果某些实现阻止您这样做,请更改它。
  • “实施具体原因”是什么?
  • 如果你可以控制 A 和 B 继承的内容(并且你必须按照你的 C-->A、C-->B 解决方案的建议)我不明白你为什么突然 缺少该控件来简单地让 A-->B 完成它。

标签: c++ inheritance virtual-inheritance


【解决方案1】:

您要查找的内容称为Composition (over Inheritance)。

组合优于继承(或组合重用原则)在 面向对象编程是一种技术,通过它类可以 通过包含其他实现多态行为和代码重用 实现所需功能的类,而不是通过 继承。

这意味着您可以让class B 包含class A 的实例,而不是让class B 继承自class A。这也是良好的编码实践,以避免class A 和class B 之间的紧密耦合。

【讨论】:

    【解决方案2】:

    您可以这样做,但是如果您将 class C 创建为抽象基类并让 A 类和 B 类继承自它,那么您将意识到 class A 和 class B 将是无关的,除了以下事实:它们继承自同一个抽象基类。这意味着您将无法将 class B 的实例转换为 A 等。通常,此类实现取决于用例。

    例如:

    您的class C 是Person,class A 是Teacher,class B 是Student。那么学生不是老师,老师也不是学生,所以这样的实现是有效的。

    【讨论】:

    • 如果 C 类不是抽象类,并且如果 C 类提供了一些默认功能,那么 A 类和 B 类将共享 C 类的功能。
    【解决方案3】:

    您可以通过创建另外两个类PA 和PB 来使用代理类,其中PB 继承PA。这些代理类分别复制了A 和B 的接口,但实际上并没有实现它们。相反,他们只是在 A 和 B 的实例中调用函数。

    【讨论】:

      【解决方案4】:

      A 类将包含虚函数的实现,B 类也可以定义相同的一组函数

      这样你会有代码重复,这不是一件好事。

      如果您不想使用继承,请尝试组合。

      我之前解释过作文here。

      【讨论】:

      • 您缺少“这里”链接
      • @alestanis:谢谢。已更正。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2010-12-14
      • 2014-10-22
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多