在我們的系統,我們有在這種設計中,我可以使用dynamic_cast以外的東西嗎?
- 多個deviceTypes
- 每個設備類型可以有不同的配置類型
- 每個設備類型將是一個圖書館自身的
我在我被迫使用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在基類中定義爲Config*
。在A0Device::display()
- 我需要訪問devConfig對象(如A0Config
類型)。 virtual createDevConfig()
確保config對象的類型始終爲A0Config
A0Device
=>在這裏使用dynamic_cast安全嗎?有沒有更好的設計方法?
爲什麼A0Device需要一個基類? –
如果您還沒有聽說過[double dispatch](https://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_in_C.2B.2B),請看一看。那是另一個可能的解決方案 –
您可以將'devConfig'字段移動到'A0Device'中,然後將其類型更改爲'A0Config *',因爲它現在只針對'A0Device'。 – immibis