【发布时间】:2014-03-13 13:01:32
【问题描述】:
问题适用于qt库的QGraphicsView类。
然而,这个问题更普遍。所以,如果我没有遗漏qt中的任何特殊机制,大概可以在不知道qt的情况下讨论。
我正在继承 QGraphicsView 以添加一些我需要的功能。
例如。我有一个ScalableView、PannableView 和LabeledView 来添加独立的功能。
我现在使用的子类化在以下意义上是线性的:
ScalableView 派生自 QGraphics 视图。
PannableView 派生自 ScalableView 视图。
LabeledView 派生自 PannableView 视图。
由于这些功能是独立的,因此存在设计缺陷。
应用 装饰器模式 来解决这个问题似乎适合我。
问题是,QGraphicsView 不是接口,也不存在像 QAbstractGraphicsView 这样的接口类。所以,对我来说,不清楚如何实现这种模式。
另一个想法是使用模板。所以我可以从模板T 中导出每个视图。然后,我可以像 ScalableView<PannableView<LabeledView>>> 一样进行 insantiations。
您有什么更好的解决方案吗?在这种情况下,我更喜欢一种实现装饰器模式的方法,因为我想避免使用许多会增加编译时间的模板类。
【问题讨论】:
-
ScalableView 和 PannableView 为 QGraphicsView 添加了什么,而 QGraphicsView 类本身尚不可用?如果您只是删除功能,那是什么原因呢?
-
不是删除,而是添加功能。它使用鼠标滚轮使视图可缩放,并提供适合视图的功能。 PannableView 提供使用鼠标左键平移。
-
为什么不只从QGraphicsView继承一次,你需要不同功能的不同视图吗?
-
是的,这是主要原因。
-
@DrD 我看到的问题如下。为了应用装饰器模式,我将引入一个类 DecoratorView。这将从 QGraphicsView 派生,并且必须聚合一个 QGraphicsView。这可以通过接口实现。但是对于一个非抽象类,我最终会得到两个不同的 QGraphicsView 实例。
标签: c++ qt oop design-patterns