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