0

在 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

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

我想这样做,不要将我的方法/属性与DrawingArea从基类继承的方法混合Gtk::DrawingArea。因此,当我访问某些东西时,我明确地知道我在我的创作中使用了某些东西,因为我的类定义中只有我的东西。虽然从. Gtk::DrawingArea_Gtk::DrawingAreaGtk::DrawingArea

4

1 回答 1

1

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

更长的答案:

我想这样做,不要将我的方法/属性与从基类 Gtk::DrawingArea 继承的 DrawingArea 方法混合。

在我看来,不应该选择公共继承与组合,因为它们具有非常明确的概念含义。从基类公开继承的子类意味着(大多数情况下,见下文)这两个类具有is-a关系。组合意味着一种has-a关系。

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

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

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

希望这可以帮助!

于 2018-03-23T00:29:43.720 回答