【问题标题】:Can polymorpism be applied to composition in c++?多态性可以应用于 c++ 中的组合吗?
【发布时间】:2020-09-25 09:04:06
【问题描述】:

我正计划使用和其他OOP技术制作一个2d棋盘游戏。我对 polymorphism 了解一些,并且想知道 polymorphism 中使用的技术是否可以通过 composition 将职责从基类委托给子类。

[已编辑] 棋盘上有玩家。我想多态地调用两个玩家中定义的方法函数 move ,而不必说 player1.move(), player2.move()

【问题讨论】:

  • 您能举个例子吗?通过组合实现多态性是什么意思?
  • "并且想知道多态性中使用的技术是否可以通过组合将职责从基类委派给子类。" 不正是这样吗Composite Pattern 描述?
  • 一个棋盘有玩家,我想多态地告诉两个玩家移动他们的棋子而不必说 player1.move() 和 player2.move()
  • 如果两种最常用的技术不能一起工作,那就太糟糕了。请给我们一些代码。任何例子都可以,但没有“是”是唯一的答案
  • 当然。您可以使用virtual 方法从基类引用中调用派生/子类的方法,这与它在Java 中的工作方式相同。您不需要它来使用组合原理来构建数据,但它就在那里。

标签: oop polymorphism composition


【解决方案1】:

前言

不要迷失在设计模式或设计技术中。这个问题似乎是一个 XY 问题。始终退后一步,考虑您想要实现的目标。

目标

一次呼叫要求两名玩家移动。

TL;DR

如果没有其他上下文,我会说只是打电话给他们!

说明

一般:

  • 棋盘总是有两个玩家。 (除非您正在设计专门的规则)
  • 国际象棋流程始终以循环方式运行(第一,然后第二,然后重复)。

那么国际象棋流程控制器调用两个玩家按固定顺序移动有什么问题?

应用多态性来替换下面的代码你会得到什么?

void begin_round(){
   player1.move();
   player2.move(); 
}

你可以通过调用移动来节省两行类型......嘿等等!这就是begin_round() 所做的! 多态方法并没有节省任何东西,反而增加了系统的复杂性,这对系统设计来说是一个坏兆头。

大多数时候,尽可能愚蠢的设计比复杂的方法要好,除非该设计可以节省大量维护或开发资源。如果一个设计没有节省任何东西,那么在必须使用之前不要使用它。

其他

在您的情况下,组合很常见,因为 gamea board and two players. 的组合

【讨论】:

    【解决方案2】:

    是的,可以实现,你的例子是什么?

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多