是否可以使用 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::DrawingArea
的 DrawingArea
方法混合。因此,当我访问某些东西时,我清楚地知道我在我的创作中使用了某些东西,因为我的 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。
希望对您有所帮助!
首先在 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::DrawingArea
的 DrawingArea
方法混合。因此,当我访问某些东西时,我清楚地知道我在我的创作中使用了某些东西,因为我的 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。
希望对您有所帮助!