【问题标题】:Inheritance for adding functionality添加功能的继承
【发布时间】:2011-11-30 10:08:20
【问题描述】:

我有一个关于类继承的简单问题。

假设我有课。它具有一些基本功能。 现在我需要使用该类,但我需要添加一些仅针对该目的的其他功能。所以我的那个类的界面会被破坏。基础类在很多地方都以is的形式使用。

我应该从这些基本类派生吗?还是更好的解决方案?

更多细节:基本类是文本编辑器,具有导入/导出到 XML、HTML 和导航控件等功能。它看起来就像 stackoverflow 的编辑器。 而且我需要添加一些只针对新用途的方法。

【问题讨论】:

  • 您需要提供更多背景信息才能获得有用的答案。您需要访问私有成员或受保护成员吗?接口在哪方面坏了?您为什么犹豫将更改放入现有类?
  • @userbb:这取决于上下文。 Base->Derived Derived 可以有自己的功能。当我们必须将 Derived 视为 Base 时,它​​应该作为 Base(Liskov 替换原则)的一种工作,当我们将其视为独立类时,它可以有自己的行为/支持行为。所以它是程序员的选择来决定设计

标签: java c++ oop


【解决方案1】:

在 C++ 中inheritance is (usually) not for code-reuse。替代方案是Composition,或VisitorDecorator 等模式。

【讨论】:

  • 今天仍然如此,尤其是在具有元编程的 C++ 中,以及诸如 CRTP 之类的东西中?
  • 我想你说得有道理——但我仍然认为你应该小心使用继承来重用代码,它会很快导致难以理解的代码。
【解决方案2】:

我认为您可以使用组合,只需创建另一个类并让这个特定类成为成员,然后您可以在不破坏主类接口的情况下实现任何功能并使用主类的所有当前方法。

【讨论】:

    【解决方案3】:

    如果你的类有函数 a()、b() 和 c(),并且你添加了 f()、g() 和 h(),而不修改 a()、b() 和 c 的前置条件和后置条件(),您的客户不会注意到界面中的这种“变化”——它只是一个扩展,它将与您现有的代码兼容。在这种情况下,您可以“就这么做”。

    您的更改将如何影响现有代码?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多