【问题标题】:Case to inherit a nontrivial class?继承一个非平凡类的案例?
【发布时间】:2009-03-01 23:38:59
【问题描述】:

我正在阅读 C# 中的 seal 关键字。我不记得我上次从标准库继承是什么时候了。在 c++ 中,我记得继承了一个 std 接口,它定义了几种类型并使用了我的一些参数。但那是 1) 微不足道的 2) 接口

从我的脑海中,我不记得我继承的任何类没有期望被继承的虚函数。谁能告诉我你需要继承一个不是接口的非平凡类的情况?

我什至可以说,除非它有虚函数,否则不要继承一个类,这是一个很好的经验法则。这是一个好的经验法则吗?

注意:我使用 operator SomeClass& SomeClass() { return m_someClass;在我需要将我的对象作为另一个类传递的情况下。效果很好。

【问题讨论】:

    标签: inheritance


    【解决方案1】:

    它实际上用在 C++ 中,用于所有这些不是一种继承(例如,继承一个实现、mixins、boost::noncopyable,你从它继承并使你的类不可复制,boost::operators您从某个类继承的位置,它将向您的类添加一些运算符)。此外,在使用 C++ 类型进行元编程时,从其他类型继承是组合类型的最简单方法之一。

    从没有虚函数但充当“某种”接口的类继承的另一种情况是静态多态性(CRTP 等技术,其中类 ConcreteA : BaseA)。它们不需要虚函数,因为一切都在编译时解决。

    然而,如果你想以运行时多态的方式对待你的类,你真的应该让至少一个方法是虚拟的,那就是析构函数。有例外,但很少见。

    即使你有一个多态的层次结构,你有时也会从具体的类中派生出来。一个例子是从 TextEdit 派生的 SingleLineEdit。但是,这有点危险,因为它破坏了父类的封装(例如,它的方法可能需要一些实现细节,并且您必须在子类中尊重并保留它们 - 这可能很棘手,因为它们是可能的实现细节在下一版本等中更改,恕不另行通知)

    【讨论】:

      【解决方案2】:

      我认为面向对象编程的关键概念是多态性。如果从特定类继承不允许您利用多态性,那么继承的意义何在?因此,如果没有要覆盖的方法,则不要子类化。您只会增加代码的复杂性。如果您想要很多相同的功能,只需将现有的类包装在您自己的中即可。

      【讨论】:

      • OOD 的关键概念是数据和功能被收集在一起以形成代表他们建模的主题的对象。多态性是该概念的延伸,仅此而已。
      • OOP 的关键概念是没有人可以就它是什么达成一致。至于多态性是该概念的扩展,我假设您可以在不“将数据和功能一起收集以形成对象”的情况下实现多态性。
      • 尽管如此,继承的主要目的是促进多态性,而不是表示现实世界的对象(只需查看 Liskov 替换原则,了解如何使用 OOP 对现实世界的对象建模工作)。
      • @Smashery:LSP 如何暗示“使用 OOP 对现实世界的对象进行建模不起作用”?
      • LSP 给出的典型例子是正方形和长方形。在现实世界中,正方形是矩形的一种。但是,如果将其子类化,则违反了 LSP(因为矩形可以做正方形不能做的事情:具有不同长度的边)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      相关资源
      最近更新 更多