我认为这时我的想法不对,我正在寻找有关如何在C++中连接以下面向关注的类的帮助。

SensorBase:
包含典型的传感器功能。大多数传感器共享相同的功能,但是某些功能取决于每个特定的传感器类别,因此被声明为“虚拟”(fe SensorBase::calcFactor()SensorBase::calcCelling())。

SensorThreshold和SensorTrend:
这些类扩展了SensorBase类的特定位的功能,具体取决于我是否要针对“阈值水平”跟踪当前传感器读数,或者是否要跟踪传感器读数序列的趋势。它们都实现不同的“calcFactor()”。这些类是从SensorBase派生的,这是绝对有意义的。

最后,我的混淆发生在这里:
CO2传感器,NH3传感器,O2传感器等:
这些是“Xgas”传感器类(从现在开始将被称为XSensor作为一个组)。对于每个传感器,我可能需要跟踪阈值或所获取值的趋势,或同时跟踪两者。该语句建议我可以声明一个(或两个)SensorThreshold / SensorTrend对象。

问题(和扭曲)是每个XSsensor需要重新定义SensorBase::calcCelling()函数。因此,以这种方式思考似乎可以从SensorThreshold或SensorTrend(作为公共(public)虚拟机以避免“菱形继承(钻石问题)”)派生XGasSensor会有所帮助。但是然后我不知道哪个SensorThreshold::calcCelling()和SensorTrend::calcCelling()被调用。 2具有相同的实现,但是可以使用不同的值调用param。

如果我没记错的话,编译器应在此处抛出错误并中止编译。但是,接下来,我无法从每个XGasSensor实现calcCelling()。

上面总结了以下内容

class SensorBase
{
    public:
        virtual calcFactor();
        virtual calcCelling();
};

class SensorThreshold : virtual public SensorBase
{
    public:
        calcFactor();
        calcCelling();
};

class SensorTrend : virtual public SensorBase
{
    public:
        calcFactor();
        calcCelling();
};

然后要么
class CO2Sensor
{
    public:
        SensorThreshold sensorThres;
        SensorTrend sensorTrend;
        //but I cannot implement calcCelling() now
};

要么
class CO2Sensor: public SensorThreshold , public SensorTrend ;
{
    public:
        calcCeilling(); //this would probably be "ambigious" error by the compiler
};

最后,我猜的问题是:如何在SensorThreshold和SensorTrend中实现SensorBase的位,以及在每个XGasSensor中实现其他位?并同时将我的XGasSensor实现基于SensorThreshold或SensorTrend或两者?

编辑:

如果我说当前SensorThreshold和SensorTrend功能(如下所述)是SensorBase类的一部分,则上述内容可能更有意义。因此,所有XGasSensors(稍后还将进行说明)都派生SensorBase并实现calcCeiling()。这样,所有传感器都可以同时跟踪阈值和趋势,这并不是理想的选择(因为并非所有传感器都需要阈值跟踪和趋势跟踪)。这就是为什么我试图将阈值相关功能与趋势相关功能分开。

最佳答案

如果不尝试在calcCeiling()中覆盖XSensor,则尝试在XSensor上调用此方法时会出现歧义错误。但是,您可以通过限定条件来调用它,可以从SensorThresholdSensorTrend调用此方法的任何版本。如果您在calcCeiling()中覆盖XSensor,则对XSensor的调用将是明确的

class CO2Sensor: public SensorThreshold , public SensorTrend
{
public:
    int calcCeiling() override {
        SensorThreshold::calcCeiling(); // this works
        SensorTrend::calcCeiling();  // this also works
    }
};

// by another object.
SensorBase* co2sensor = CreateSensor("CO2");
co2sensor->SensorThreshold::calcCeiling(); // non-ambiguous.
co2sensor->SensorTrend::calcCeiling(); // non-ambiguous.
co2sensor->calcCeiling(); // non-ambiguous (calls CO2Sensor::calcCeiling.)

我会重新考虑您的继承模型,因为听起来您正在尝试向传感器添加其他功能,这听起来比多重继承更好地描述为decorator pattern

关于c++ - C++ OOP体系结构:在从基类声明对象还是继承基类之间做出决定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35820746/

10-11 12:21