В нашей системе есть
- несколько типов устройств
- каждый тип устройства может иметь другой тип конфигурации
- каждый тип устройства будет собственной библиотекой
Я в ситуации, когда я вынужден использовать dynamic_cast. Мне интересно, есть ли лучший способ спроектировать это?
что у меня есть:
// in common code
class Config {public: virtual ~Config(){} };
class Device {
protected:
Config* devConfig;
protected:
virtual void createDevConfig() = 0;
public:
virtual void display() = 0;
};
// Device specific Code
class A0Device : public Device {
protected:
virtual void createDevConfig() { this->devConfig = new A0Config(); }
public:
A0Device() { this->createDevConfig(); }
virtual void display(){
A0Config* config = dynamic_cast<A0Config*>(this->devConfig);
if(!config) std::cout << "Null object\n";
}
};
class A0Config : public Config {};
int main() {
Device* dev = new A0Device();
dev->display();
return 0;
}
По сути, A0Device
имеет свой собственный тип конфигурации: A0Config
, который состоит из других членов. A0Device имеет devConfig
, определенный как Config*
в базовом классе. В A0Device::display()
мне нужно получить доступ к объекту devConfig (как тип A0Config
). virtual createDevConfig()
гарантирует, что объект конфигурации всегда будет типа A0Config
в A0Device
=> Безопасно ли здесь использовать dynamic_cast? Есть ли лучший способ спроектировать это?
devConfig
в полеA0Device
, а затем изменить тип наA0Config*
, поскольку теперь оно относится только кA0Device
. - person user253751   schedule 26.08.2015