【发布时间】:2021-07-06 00:33:02
【问题描述】:
假设我们有 3 个类 Button、Clickable 和 Rectangle。
它们都不是抽象的,都可以独立存在。它们都有一个position 成员变量。当Button 类从Clickable 和Rectangle 继承时,它们应该共享一个公共position 变量。
我的实现:
struct Positionable {
struct Position {
int x, y;
} position;
};
struct Rectangle: virtual public Positionable {
// ...
};
struct Clickable : virtual public Positionable {
// ...
};
struct Button : virtual public Positionable, public Rectangle, public Clickable {
Button() {
this->position.x = 1;
assert(Rectangle::position.x == 1);
assert(Clickable::position.x == 1);
assert(Positionable::position.x == 1);
}
} test;
这个问题(除了单词 position 的 3 种形式)是我觉得我打破了组合优于继承的原则,因为我继承只是为了包含一个变量。 是否存在具有相同行为的设计模式?在这种情况下如何使用合成?
编辑:
我正在寻找一个解决方案,其中Button 继承自Clickable 和Rectangle,因为它是一种is-a 关系。 (这可能不是最好的例子,但假设它是真的)
我也不想从Positionable 继承,因为这是一种有关系。
我想要和我的实现一样的行为,所以:
- 他们都有一个
Position position - 当它们相互继承时,它们共享这个变量
- 我不使用 setter/getter
基本上我想要虚拟变量之类的东西,但 c++ 还没有这个功能,所以我正在寻找一个明智的替代品。
【问题讨论】:
-
使用policy based design会更好吗?
-
这是一个有趣的设计,但我不确定我如何在这里申请。
-
按钮是“形状”和“动作”策略的用户,可以填充“矩形”和“可点击”。
-
不确定
Clickable应该有Position。
标签: c++ oop design-patterns diamond-problem