如何使构造函数返回子类对象

时间:2010-07-16 14:41:35

标签: design-patterns oop constructor factory-pattern

我刚读了一本关于面向对象编程模式的书。它描述了一个Factory模式,通过该模式可以调用对象的静态工厂方法,该对象将返回一个期望类型的新对象,但它将被适当地子类化。

我的问题是,这个功能可以由类的构造函数提供吗?如果是这样的话?我不是为什么?想象一下,我有一个名为VillagePerson的课程,该课程有PoliceOfficer,NativeAmerican,Cowboy,Biker,ConstructionWorker和Sailor。构造函数接受person的文本字符串描述,解析它,并返回我想要的特定类型的人。这只能用静态工厂方法吗?

2 个答案:

答案 0 :(得分:3)

否。通常,构造函数是由语言自动调用的函数,用于初始化正在创建的对象。这本身就意味着构造函数无法提供工厂的“叫我创建对象”功能。

此外,构造函数通常从像new ClassName(args)这样的表达式调用,这些表达式在大多数语言中定义为创建ClassName的实例而不是从ClassName继承的类。因此,您不能使用new或构造函数来创建任何类型的实例。

另一方面,我确实说过“大多数语言中的 ”:有些像JavaScript一样,让你从构造函数中返回任何你想要的东西,而其他像Objective Caml一样,将构造函数视为工厂功能。

答案 1 :(得分:1)

这是Steven Sudit评论

的解释

VillagePerson

之上创建一个Proxy课程
  • 代理实现与VillagePerson相同的接口,但不会从中继承任何实现代码。
  • 代理包含对子类别VillagePerson对象的引用_vpImpl
  • 在代理上调用方法时,代理只是将调用传递给_vpImpl对象。

要构造子类VillagePerson,Proxy的构造函数可以调用子类的特定构造函数,然后将其存储在_vpImpl中。