【发布时间】:2010-09-10 14:33:27
【问题描述】:
我一直在思考这个面向对象的设计问题,但无法提出令人满意的解决方案,所以我想在这里向人群开放以征求意见。
我有一个代表回合制棋盘游戏的 Game 类,就这个问题而言,我们可以假设它类似于 Monopoly。 在我的设计中,我有一个 Player 类,其中包含一个方法 TakeTurn。
Game 循环遍历所有 Player 并调用 TakeTurn 方法来完成所有必要的事情以完成转弯。 我希望能够拥有 n 个玩家,并且能够将任意数量的玩家设置为电脑玩家。 所以,我的想法是有一个 HumanPlayer 类和一个 ComputerPlayer 类,它们都派生自 Player。
Game 只知道 Player 类,并简单地依次在每个 Player 上调用 TakeTurn 方法。 我的问题在于 ComputerPlayer 对象可以完全自动化,即与 Monopoly 示例保持一致,可以决定使用某些逻辑购买房产。 现在,使用 HumanPlayer 对象,它需要从实际用户那里获得输入才能购买房产,例如,这似乎暗示了不同的界面,并且可能意味着它们不应该派生
如果不让 Game 类明确了解各种 Player 类的实际实现,我无法为该问题提出一个好的解决方案。 我总是可以在 Game 类中假设永远只有人类和计算机玩家并有效地关闭它以进行扩展,但这似乎不是好的 OO 编程。
对此的任何意见将不胜感激。
【问题讨论】:
-
我不确定open-closed-principle 是否适用于此。
标签: language-agnostic oop ooad open-closed-principle