【问题标题】:How to make a constructor return a subclassed object如何使构造函数返回子类对象
【发布时间】:2010-07-16 14:41:35
【问题描述】:

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

我的问题,这个功能可以由类的构造函数提供吗?如果有怎么办?我不是为什么?想象一下,我有一个名为 VillagePerson 的类,它有子类 PoliceOfficer、NativeAmerican、Cowboy、Biker、ConstructionWorker 和 Sailor。构造函数获取人员的文本字符串描述,对其进行解析,然后返回我想要的特定类型的人员。这只能通过静态工厂方法实现吗?

【问题讨论】:

  • 这个问题的答案是特定于语言的。

标签: design-patterns oop constructor factory-pattern


【解决方案1】:

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

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

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

【讨论】:

  • 您的答案是正确的,但即使在静态类型语言中,也有一些方法可以近似动态类型。例如,VillagePerson 构造函数可以调用VillagePersonImplFactory 静态工厂方法来初始化其_vpImpl 成员。然后,当它的Dance 方法被调用时,它可以将调用链接到_vpImpl。我敢肯定 GoF 设计模式书对此有一些官方标签;我想一些关于模板的事情。
  • @Steven Sudit:是的。不过,我确实发现使用工厂方法更容易。
【解决方案2】:

这是对 Steven Sudit 评论的转述

VillagePerson 之上创建一个Proxy 类:

  • Proxy 实现与VillagePerson 相同的接口,但不继承任何实现代码。
  • 代理包含对子类 VillagePerson 对象的引用 _vpImpl
  • 在代理上调用方法时,代理只需将调用传递给_vpImpl 对象。

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

【讨论】:

  • 这是对 Steven Sudit 评论的转述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多