4

(这个问题更多是针对可以访问这本书的人,否则很难将其置于上下文中)

我一直在阅读 GoF 的“设计模式”一书,在“创建模式->原型->示例代码” (第 124 页)下有一句话让我有点困惑 。

在页面底部附近,有 的实现BombedWall,据我了解,它是一个具体的原型,因为它继承自Wall,并重新定义了Clone()虚函数。BombedWall还定义了另一种方法,任何使用常规接口HasBomb()的客户端都不知道。Wall

BombedWall存储在(Prototype 客户端)中的唯一方法MazePrototypeFactory是作为Wall*(从 中返回BombedWall::Clone),HasBomb()据我了解,之后唯一的方法是将其向下转换Wall*BombedWall*(动态或静态,取决于关于我是否知道类型),然后我可以访问该HasBomb()方法。

这一切对我来说都很好;但后来作者说(同一页,最后一句,第二段最后一段):

“客户永远不必将返回值向下转换为Clone所需的类型”

什么?那我该怎么去HasBomb()

我肯定错过了什么...

4

2 回答 2

1

我给出了答案,现在完全重写了:)

基本上,MazePrototypeFactory 只知道它可以使用的基类。它对您将要创建的任何子类一无所知,但它仍然应该能够将任何可能的子类放入迷宫中。

该模式基本上确保 MazeFactory 将获得它理解的类型的指针 Wall,而不是导致需要修改 MazeFactory 以能够生成所有子类的对象。

MazeFactory 是第 124 页上提到的客户端。它不需要知道 HasBomb 来构建迷宫。

于 2011-08-30T13:47:29.437 回答
0

我的猜测是,这个方法的存在只是为了表明它BombedWall是一个具有扩展公共接口的不同类。但是,此接口并未在示例上下文中使用:迷宫构建算法不区分墙的类型,而其他子系统(例如渲染引擎)可能会这样做。

于 2011-08-30T14:00:33.053 回答