2011-04-01 56 views
0

如果我有一類動物,並且動物通過動物類型,那是動物的類型。動物可以使用這些信息實例化一個孩子嗎?如果類實例化對象不關心它正在創建的對象的類型,這不是一件好事嗎?它刪除了決定要實例化哪個子類所需的case語句。家長可以選擇實例化哪個孩子嗎?

例如:

@animal = Animal.new(cat) which instantiates a Cat < Animal object. 
+1

這令我寧可在像Ruby語言反常。如果'animal_type'實際上是一種動物類型,那麼您應該實例化'animal_type' - 只需要'animal_type.new'而不是'Animal.new(animal_type)'。不需要案例說明或花式犛牛剃鬚。消息分派已經完成了確定接收方類的工作,併爲你調用適當的方法。 – Chuck 2011-04-01 18:17:54

+0

@Chuck:如果'animal_type'來自yaml,那麼在yaml文件中使用':cat'要比'Cat'類的yaml容易得多。 – 2011-04-03 23:56:43

回答

3

是。請看工廠設計模式。

+0

哇,我不知道你可以重寫self.new在軌道:)酷。 – Augusto 2011-04-01 18:10:12

+0

真的不是關於重寫self.new。 – Eimantas 2011-04-01 18:14:20

0

我不知道你的問題是什麼,但如果你想創建一個變量的類的實例,你可以直接調用Class#new方法:

@animal = cat.new 

如果你只希望這種情況發生如果類實例catAnimal一個子類,然後做

@animal = cat.new if cat.superclass == Animal