我有两个类Sensor1和Sensor2,它们是从Sensor类继承的。我正在基于运行时的某些条件创建Camera类,其基类应为Sensor1或Sensor2。是否可以?

一种方法是在Camera中为Sensor创建一个指针成员,然后将其分配给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(){}
}

最佳答案

这是使用Strategy模式之类的好地方。

无需更改Camera的基类,而是让Camera包含指向Sensor1Sensor2的指针。那是您检查病情的地方。

如果这两个类Sensor1Sensor2继承自一个公共(public)基础(例如Sensor),则该模式很容易实现。

我的C++有点生疏,因此请视其为代码还是伪代码,具体取决于其最终的有效性:

class Camera {
private:
  Sensor* obj;
public:
  Camera (bool flag){
    if (flag) {
      obj = new Sensor1();
    } else {
      obj = new Sensor2();
    }
  }
}

您还可以提供函数(一个用于Sensor1,另一个用于Sensor2)以将obj字段转换为正确的类型。

关于更改基类

让我们谈谈为什么无法切换基类,以及即使可以的话也不建议这样做。

可以将您的类视为包含字段的普通结构,再加上在该结构类型的名为this的变量上运行的许多函数。

如果您从Sensor1继承,则Camera的结构将包含Sensor1的所有字段和Camera的所有字段。为了论证,我们假设它们总共增加了42个字节的内存。假设将Sensor2中的字段与Camera中的字段组合起来,最多可增加60个字节。

显然,如果您随后动态更改基本类型,则内存大小应该更改,但是在您进入构造函数时,分配已经完成。因此,如果您当时可以将基本类型从Sensor1切换到Sensor2,则突然会有18个字节太少,更新其中任何一个都会覆盖可能分配给其他内容的内存。那是一场灾难,等待发生。

因此,我们在这里使用了像Strategy这样的模式。它更易于推理,易于实现,被广泛理解且安全。

10-05 18:37