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

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

本文关键字:组合 继承 GTKmm Gtk 可以使 rawingArea 是否      更新时间:2023-10-16

在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)之间的关系到底是什么。你的班级是某种绘图区域吗?如果是这样,我会建议公共继承。您的类是否有(或包含)绘图区域?在这种情况下,我建议作曲。

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

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

希望这有帮助!