不同的类模式:条件构造函数/方法与继承?

时间:2014-09-13 17:38:12

标签: c++

我目前拥有一个自定义外设,有8个红灯(第一个字节),8个开关(第二个字节),4个按钮和4个绿灯(第三个字节)。我不是每次都用低级指令来操作硬件,而是决定专门为此做一个课程。在这个课程中,我决定创建外设可以采用的3种可能的模式:

1-默认:每个控件都在控制它们上方的灯光;然后每个灯依赖于每个控件,因此它们的状态不能由程序本身控制。

2- MAPPABLE:每个控件现在都可以有自定义行为;然后每个灯都独立于每个控件,因此它们的状态可以由程序本身控制。

3-动画:现在每个控件都被禁用,您可以选择各种轻型动画。

这三种模式都存储在枚举中:

enum Mode { DEFAULT, MAPPABLE, ANIMATION };

现在这里是我的构造函数:

ZeBox(Mode mode = DEFAULT);
ZeBox(std::bitset<4> lightsGreen, Mode mode = DEFAULT);
ZeBox(std::bitset<8> lightsRed, Mode mode = DEFAULT);
ZeBox(std::bitset<4> lightsGreen, std::bitset<8> lightsRed, Mode mode = DEFAULT);

问题如下:如果我决定初始化灯的状态,模式 CAN NOT 是DEFAULT,因为就像我说的那样,DEFAULT模式下的灯状态仅依赖于控件,并且不是程序本身。但是,其他两种模式(MAPPABLE和ANIMATION)中的灯状态 CAN 都会受到程序的影响。

这是可以通过使用继承解决的问题(每个模式/类,例如'DefaultZeBox','MappableZeBox'和'AnimationZeBox',有一个自定义构造函数和自定义方法,它们都来自基础类'ZeBox'),但是会有一个问题:我怎么能用方法改变外设模式?我知道我可以通过简单地使用多态并每次实例化一个新对象来实现它,但我做了这个类以使新手容易,我想为此目的制作一个方法(如'SetMode(Mode new_mode)')。但是,如果我不使用继承,我将不得不找到一种方法来“启用/禁用”方法,具体取决于您选择的模式。

我更喜欢使用继承,但我不知道如何使用方法更改模式。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

一个类应该定义一个行为,根据Single Responsibility Principle应该只有一个改变的理由。

让我们假设你定义一个接收模式的构造函数。然后你的班级将有N个理由改变(N是模式的数量)!

所以我会去继承。但请确保有工厂根据所选模式创建正确的实现。

要在运行时更改模式 - 请阅读Strategy pattern