是否可以使用 Gtk::D rawingArea (GTKmm) 作为组合而不是继承?
Is is possible to use Gtk::DrawingArea (GTKmm) as compositions instead of inheritance?
在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
)之间的关系到底是什么。你的班级是某种绘图区域吗?如果是这样,我会建议公共继承。您的类是否有(或包含)绘图区域?在这种情况下,我建议作曲。
如果你违反了这些概念,你几乎肯定会得到难以使用和不一致的类,并且区分哪个方法来自哪个类将是你最不关心的问题。
最后,请注意,这里写的关于继承的内容比这里写的要多得多,并且存在一些例外。有关更深入的讨论,请参阅此帖子。
希望这有帮助!
- 混合组合和继承的C++问题
- C++基于策略的设计:继承与组合
- 工厂方法模式使用继承而抽象工厂模式使用组合如何
- vector_base继承与组合
- 如何在 c++ 中将多重继承与组合一起使用?
- 是否可以使用 Gtk::D rawingArea (GTKmm) 作为组合而不是继承?
- C++:树根应该使用继承而不是组合吗?
- 必要时违反组合而不是继承可以吗?
- 避免使用组合进行额外的堆分配(过度继承)
- 为什么我在使用组合而不是继承时得到 C4624(无法访问基类析构函数)
- 编译器如何在继承C++中进行组合
- 类继承/组合设计
- Qt和C++:双重继承与组合
- 使用组合而不是继承的方法转发(使用C++特性)
- 将继承更改为组合
- C++中组合关系的继承
- 为什么与组合相比,私有继承会增加有人破坏我的代码的概率
- C++ 继承和组合一起使用
- 可变模板和多重继承的组合
- 两个接口,多个继承组合成一个容器