是否可以使用 Gtk::DrawingArea (GTKmm) 作为组合而不是继承?

Is is possible to use Gtk::DrawingArea (GTKmm) as compositions instead of inheritance?

首先在 GTKmm documentation example and on the more complex clock example 上,他们正在继承 public Gtk::DrawingArea 来构建他们的应用程序。

#ifndef GTKMM_EXAMPLE_MYAREA_H
#define GTKMM_EXAMPLE_MYAREA_H

#include <gtkmm/drawingarea.h>

class MyArea : public Gtk::DrawingArea
{
public:
  MyArea();
  virtual ~MyArea();

protected:
  //Override default signal handler:
  bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) override;
};

#endif // GTKMM_EXAMPLE_MYAREA_H

是否可以组合使用 DrawingArea,而不是继承它并覆盖 on_draw 虚拟方法?

我想这样做,不要将我的 methods/attributes 与继承自基础 class Gtk::DrawingAreaDrawingArea 方法混合。因此,当我访问某些东西时,我清楚地知道我在我的创作中使用了某些东西,因为我的 class 定义中只有我的东西。通过从 Gtk::DrawingArea 继承东西,我不能确定它是我的东西还是 Gtk::DrawingArea 的东西,除非我知道在 Gtk::DrawingArea.

上定义的所有东西

简短回答:不(至少对于您所关心的问题),它不是这样设计的。

更长的答案:

I would like to do so, to not mix my methods/attributes with the DrawingArea methods inherited from the base class Gtk::DrawingArea.

Public 在我看来,不应该选择继承与组合而不是这些标准,因为它们具有非常明确的概念含义。子 class publicly 从基础 class 继承意味着(大多数情况下,见下文)两个 class 有 is-a 关系。组合意味着 has-a 关系。

所以要回答你的问题,你应该问问自己这两个 class 之间的关系到底是什么(你自己的和 Gtk::DrawingArea)。您的 class 是某种绘图区吗?如果是这样,我会建议 public 继承。您的 class 有(或包含)绘图区吗?在那种情况下,我会建议组合。

如果您违反了这些概念,您几乎肯定会得到难以使用且不一致的 classes,而区分哪种方法来自哪种 class 将是您最不关心的问题。

最后,请注意,关于继承的内容比这里写的要多得多,并且存在一些例外情况。有关更深入的讨论,请参阅 this post

希望对您有所帮助!