我的类的层次结构类似于:
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种方法:
我倾向于使用GetScheduleType()虚函数进行dynamic_cast,但这看起来并不完美。但是,也许,这是一个教科书案例,说明为什么dynamic_cast存在。处理这种情况最正确的方法是什么?
我已经看到SO上的答案不喜欢dynamic_cast和NotImplementedException方法,这增加了我现有的困惑: - )。
(请注意,这是一个简化的例子。实际上,如果重要的话,那里有大约4-5种不同类型的时间表,每个时间表上有4-5个属性。)