2011-04-01 51 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