"抛出NotImplementedException"从Base或dynamic_cast到派生类型?

时间:2017-09-15 11:17:03

标签: c++ oop inheritance

我的类的层次结构类似于:

class Schedule
{
    chrono::time_point GetStartTime();
    chrono::seconds GetDuration();
    DeviceID GetDeviceID();
}

class DeviceSchedule : public Schedule
{
    DeviceState GetDeviceState();
    DeviceIntensity GetDeviceIntensity();
}

class SensorSchedule : public Schedule
{
    float GetTemperature();
    float GetHumidity();
}

有一个Scheduler类,它知道要构造什么类型的Schedule并将其添加到列表< shared_ptr< Schedule>>并且有一个不同的线程可以在以后醒来并执行时间表。

基本上,执行线程需要访问不同类型的数据,具体取决于正在执行的计划类型。为此,我提出了3种方法:

  1. dynamic_cast到每个派生类型并检查NULL
  2. dynamic_cast基于基础Schedule类
  3. 中的纯虚拟GetScheduleType()函数
  4. 在基类中实现所有派生函数以抛出NotImplementedException,这样如果执行者试图在DeviceSchedule上调用GetTemperature,代码就会崩溃。 (如果发生这种情况,还有足够的日志来修复错误!)
  5. 我倾向于使用GetScheduleType()虚函数进行dynamic_cast,但这看起来并不完美。但是,也许,这是一个教科书案例,说明为什么dynamic_cast存在。处理这种情况最正确的方法是什么?

    我已经看到SO上的答案不喜欢dynamic_cast和NotImplementedException方法,这增加了我现有的困惑: - )。

    (请注意,这是一个简化的例子。实际上,如果重要的话,那里有大约4-5种不同类型的时间表,每个时间表上有4-5个属性。)

0 个答案:

没有答案
相关问题