我认为我的头脑在这一点上是油炸,我正在寻找一些帮助,如何连接以下关注的面向类在C++。
SensorBase:包含典型的传感器功能。大多数传感器共享相同的功能,但有些函数依赖于每个特定的传感器类,因此被声明为“虚拟”(fe、SensorBase::calcFactor()和SensorBase::calcCelling() )。
SensorThreshold & SensorTrend:这些类扩展了SensorBase类中仅特定位的功能,这取决于我是想根据“阈值级别”跟踪当前传感器的读数,还是希望跟踪传感器读数序列的趋势。它们都实现了不同的"calcFactor()“。绝对有道理的是,这些类是从SensorBase派生的。
最后,我的混淆发生在这里:CO2Sensor、NH3Sensor、O2Sensor等:--这些是"Xgas“传感器类(从现在起称为XSensor )。对于每个传感器,我可能需要跟踪阈值,或获得值的趋势,或者两者都要跟踪。这条语句表明,我可以声明一个(或同时声明) SensorThreshold / SensorTrend对象。
问题(以及扭曲)是,每个XSsensor都需要重新定义SensorBase::calcCelling()函数。因此,这样认为,从SensorThreshold或SensorTrend (作为公共虚拟以避免“菱形问题”)派生出的SensorTrend似乎会有所帮助。但是,我不知道将调用哪一个SensorThreshold ::calcCelling()和SensorTrend::calcCelling()。这2有相同的实现,但可以使用不同的值作为param调用。
如果我没有弄错,编译器应该在这里抛出一个错误并中止编译。但是,我没有办法从每个calcCelling实现XGasSensor ()。
以上内容包含在以下内容中:
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
};最后,我想问题是:我如何在SensorBase & SensorTrend中实现比特,以及在每个XGasSensor中实现其他位呢?同时,我的XGasSensor实现基于SensorThreshold或SensorTrend,还是两者兼而有之?
编辑:
如果我说当前SensorThreshold和SensorTrend功能(下面解释)是SensorBase类的一部分,那么上面的内容可能会更有意义。因此,所有XGasSensors (稍后也将解释)派生SensorBase并实现calcCeiling()。这样,所有传感器都跟踪阈值和趋势,这并不理想(因为并非所有传感器都需要阈值跟踪和趋势跟踪)。这就是为什么我试图将阈值相关的功能与趋势相关的功能分开。
发布于 2016-03-05 23:01:06
如果不重写calcCeiling()中的XSensor,则如果试图在XSensor上调用此方法,则会出现模糊错误。但是,您可以调用您可以从SensorThreshold或SensorTrend调用此方法的任何一个版本,只需对其进行限定。如果您在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.)我会重新考虑您的继承模型,因为听起来您正在尝试在传感器上添加额外的功能,这听起来更像是一个装饰图案,而不是多个继承。
发布于 2016-03-05 23:06:45
class SensorBase
{
public:
virtual calcFactor();
virtual calcCelling();
};
class SensorThreshold : virtual public SensorBase
{
public:
calcFactor();
Virtual calcCelling()
{ThCeiling()}
Protected:
Virtual ThCeiling();
};
class SensorTrend : virtual public SensorBase
{
public:
calcFactor();
Virtual calcCelling()
{TrCeiling();}
Protected:
Virtual TrCeiling();
};
class CO2Sensor: public SensorThreshold , public SensorTrend ;
{
Protected:
TrCeiling();
ThCeiling();
};发布于 2016-03-05 23:04:21
我相信您是说CO2传感器可以实现阈值功能或趋势功能,这将在创建这样一个CO2传感器的运行时确定。
因此,我建议一种方法,其中CO2传感器将包含一个指向基类的指针,这个指针可以在构造时初始化。
class CO2Sensor {
private:
SensorBase *sensorFunctionality;
public:
CO2Sensor( SensorBase *functionality);
returnType calcCeiling() { return functionality->calcCeiling(); }
}构造函数体将将functionality参数分配给sensorFunctionality数据成员。
如果很多传感器都有这种多功能行为,那么您可能有一个名为MultifunctionSensor的类,它执行这个调度,然后所有MultifunctionSensor类都从它派生出来。
https://stackoverflow.com/questions/35820746
复制相似问题