2009-08-20 53 views
0

我試圖做一個函數f是這樣工作的:模式初始化未知子類

StorageObject::addItem (const AbstractBase& base) { 
    AbstractBase* storage = new Derived1(base); 
} 

不過,我想f控制類Derived2的,Derived3等工作爲好。有沒有辦法讓f調用正確的構造函數,具體取決於傳遞給它的AbstractBase的特定子類,而不使用typecodes?

爲了把問題放在上下文中,我使用這個函數來初始化一個類中的對象列表。雖然我可以做類似

Derived1* temp = new Derived1(); 
storageobject.addItem(*temp); 
delete temp; 

我寧願做這樣的事情

storageobject.addItem(Derived1()); 

,並有storageobject處理一切。

+0

爲什麼不將參考存儲在storageobject中? – Zed 2009-08-20 08:46:07

回答

2

你爲什麼不實現虛擬複製方法?

AbstractBase* storage = base.Copy() 

順便說一下,這是相當具體的C++,因爲使用C#它可以簡單地通過反射來實現。

Activiator.CreateInstance(temp.GetType(), temp); 

當然,有一些很好的工廠模式,但這真的取決於你需要解決的具體問題。

+0

+1。 「複製」方法是原型模式:http://en.wikipedia.org/wiki/Prototype_pattern – 2009-08-20 10:30:58

+0

我使用的是C++,而且這似乎是訣竅,謝謝! – int3 2009-08-21 02:33:01

0
  • 如果您可以使用模板。
  • 如果你有語言沒有模板 - 使用抽象工廠模式