在GTKmm的第一个文档示例和更复杂的时钟示例中,他们正在固有构建应用程序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
虚拟方法?
我想这样做,不要将我的方法/属性与从基类Gtk::DrawingArea
继承的DrawingArea
方法混合。因此,当我访问某些内容时,我明确地知道我正在我的创作中使用某些内容,因为在我的类定义中只有我的东西。虽然通过继承Gtk::DrawingArea
的东西,我不能确定它是我的东西还是Gtk::DrawingArea
的东西,除非我知道Gtk::DrawingArea
上定义的一切。
简短的回答:不(至少对于您关心的问题),它不是这样设计的。
更长的答案:
我想这样做,不要将我的方法/属性与 从基类 Gtk::D rawingArea 继承的 DrawingArea 方法。
在我看来,公共继承与组成不应该被选择在这些标准之上,因为它们具有非常明确的概念含义。从基类公开继承的子类意味着(大多数情况下,见下文)这两个类具有is-a
关系。组成意味着has-a
关系。
所以要回答你的问题,你应该问问自己两个类(你自己的和Gtk::DrawingArea
)之间的关系到底是什么。你的班级是某种绘图区域吗?如果是这样,我会建议公共继承。您的类是否有(或包含)绘图区域?在这种情况下,我建议作曲。
如果你违反了这些概念,你几乎肯定会得到难以使用和不一致的类,并且区分哪个方法来自哪个类将是你最不关心的问题。
最后,请注意,这里写的关于继承的内容比这里写的要多得多,并且存在一些例外。有关更深入的讨论,请参阅此帖子。
希望这有帮助!