當你有一個類型依賴於某些約束的成員時,你如何設計多態。多態設計,抽象類模板
說我有這樣的:
template<typename T>
class Base
{
public:
Base() = default;
virtual ~Base() = default;
T member;
};
class DerivedA : public Base<int>
{
public:
DerivedA() {member = 5;}
};
class DerivedB : public Base<float>
{
public:
DerivedB() = default;
};
我希望能夠建立根據不同的參數,一個新的派生類對象,即:
Base *b;
if (something)
b = new DerivedA();
else
b = new DerivedB();
很顯然,我不能這樣做,因爲我需要爲b
的聲明提供模板參數。
這是不好的設計?你如何處理這個問題?
我可以寫一個小包裝:
class Wrapper() {};
template<typename T>
class Base : public Wrapper
{
// ...
};
Wrapper a, b;
a = new DerivedA;
b = new DerivedB;
但以後我不會再有機會直接向member
或Base
或Derived
聲明其他方法。我需要演員:reinterpret_cast<DerivedA*>(a)->member
,使多態無用。
謝謝
在你的設計中有一個問題...包裝界面應該沒問題,但你必須扭轉問題才能工作。 – Synxis
這讓我想起http://en.wikipedia.org/wiki/Policy-based_design – user1849534
第三級基地? –