5 c++ inheritance design-patterns
我有两个类Sensor1和Sensor2继承自Sensor类.我正在创建类Camera,基于运行时的某些条件,基类应该是Sensor1或Sensor2.可能吗?
一种方法是为Sensor in Camera创建指针成员,然后分配给Sensor1或Sensor2(基于条件),在这种情况下,对于Sensor的所有方法,我需要在Camera(setResolution和changeMode)中创建方法并调用相应的方法(我想避免)
class Sensor {
public:
Sensor(){}
~Sensor(){}
void setResolution(int w, int h) {};
void changeMode(int mode) {};
}
class Sensor1: public Sensor {
public:
Sensor1(){}
~Sensor1(){}
void setResolution(int w, int h) {\** change based on sensor **\}
void changeMode(int mode) {\** sensor specific implementation **\}
}
class Sensor2: public Sensor {
public:
Sensor2(){}
~Sensor2(){}
void setResolution(int w, int h) {\** change based on sensor **\}
void changeMode(int mode) {\** sensor specific implementation **\}
class Camera: public Sensor {
public:
Camera (bool flag){
//Change base class to either Sensor1 or Sensor2 which inherits from common base class Sensor
}
~Camera(){}
}
Run Code Online (Sandbox Code Playgroud)
这是使用策略模式之类的好地方。
让包含指向或 的指针Camera,而不是更改 的基类。那是你检查你的状况的地方。CameraSensor1Sensor2
如果这两个类Sensor1继承Sensor2自一个共同的基类(例如Sensor),则该模式的实现起来非常简单。
我的 C++ 有点生疏,所以可以将其视为代码或伪代码,具体取决于它最终的有效性:
class Camera {
private:
Sensor* obj;
public:
Camera (bool flag){
if (flag) {
obj = new Sensor1();
} else {
obj = new Sensor2();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以提供函数(一个 forSensor1和一个 for Sensor2)将字段转换obj为正确的类型。
关于更改基类
让我们谈谈为什么不可能切换基类,以及为什么即使可以切换基类也是不可取的。
将您的类视为包含字段的普通结构,以及对该结构类型的变量(名为 )进行操作的许多函数this。
如果继承自Sensor1,则结构 forCamera将包含来自 的所有字段Sensor1和 来自 的所有字段Camera。为了便于论证,我们假设所有内存加起来为 42 字节。假设将 from 的字段Sensor2与 from 的字段组合起来Camera总计达 60 个字节。
显然,如果您随后动态更改基本类型,您的内存大小应该会发生变化,但在您进入构造函数时分配已经完成。因此,如果您当时可以切换基本类型Sensor1,Sensor2您会突然发现 18 个字节太少了,并且更新其中任何一个都会覆盖可能分配给其他内容的内存。这是一场即将发生的灾难。
因此,我们使用像Strategy这样的模式,正如我在这里展示的那样。它更容易推理、易于实施、被广泛理解且安全。