加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – GoF实现Prototype模式

发布时间:2020-12-16 06:57:20 所属栏目:百科 来源:网络整理
导读:(这个问题更适用于有权访问该书的人,否则很难将其置于上下文中) 我一直在阅读GoF的“设计模式”一书,在“Creational Patterns- Prototype-示例代码”(第124页)下有一句让我感到困惑的句子. 在页面底部附近,有BombedWall的实现,据我所知,它是一个具体的原型,
(这个问题更适用于有权访问该书的人,否则很难将其置于上下文中)

我一直在阅读GoF的“设计模式”一书,在“Creational Patterns-> Prototype->示例代码”(第124页)下有一句让我感到困惑的句子.

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

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

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

“Clients should never have to downcast the return value of Clone to
the desired type”

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

我肯定错过了什么…

解决方法

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

基本上,MazePrototypeFactory只知道它可以使用的基类.它不知道你要做的任何子类,但它仍然应该能够将任何可能的子类放入迷宫中.

该模式基本上确保MazeFactory将获得一个它理解的类型的指针Wall,而不是因为需要修改MazeFactory才能生成所有子类的对象.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读