在GTKmm上的documentation example和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
虚拟方法?我想这样做,不要将我的方法/属性与从基类
DrawingArea
继承的Gtk::DrawingArea
方法混合使用。因此,当我访问某些内容时,我明确知道我正在创建内容时使用某些内容,因为类定义中只有我的内容。通过从Gtk::DrawingArea
继承东西,我不能确定是我的东西还是Gtk::DrawingArea
东西,除非我知道Gtk::DrawingArea
上定义的所有内容。 最佳答案
简短的回答:不(至少出于您的关注),它不是按照这种方式设计的。
更长的答案:
我想这样做,不要将我的方法/属性与
从基类Gtk :: DrawingArea继承的DrawingArea方法。
我认为,不应选择公共继承与组成为标准,因为它们具有非常明确的概念意义。从基类公开继承的子类意味着(大多数情况下,请参见下文)这两个类具有is-a
关系。组成表示has-a
关系。
因此,要回答您的问题,您应该问自己两个类(您自己的类和Gtk::DrawingArea
)之间的确切关系是什么。您的课堂是某种绘画区域吗?如果是这样,我建议公开继承。您的课程是否有(或包含)绘图区域?在那种情况下,我建议组成。
如果您违反了这些概念,几乎可以肯定会遇到难以使用且类不一致的问题,并且最不用担心区分哪个方法是哪个类。
最后,请注意,关于继承的内容远不止这里写的,而且还存在一些异常。有关更深入的讨论,请参见this post。
希望这可以帮助!