我已经思考了一段时间关于面向对象设计的问题,但一直没有想出一个令人满意的解决方案,因此想请大家给予意见。
我有一个代表回合制棋盘游戏的Game类,我们可以假设它类似于大富翁。 在我的设计中,我有一个包含TakeTurn方法的Player类。
Game循环遍历所有Player并调用TakeTurn方法来完成回合所需的所有操作。 我希望能够拥有n个玩家,并且能够设置任意数量的计算机玩家。 因此,我的想法是有一个HumanPlayer类和一个ComputerPlayer类,两者都派生自Player。
Game只知道Player类,并简单地依次调用每个Player的TakeTurn方法。 我的问题在于ComputerPlayer对象可以完全自动化,即保持与大富翁示例相同,可以使用某些逻辑来决定购买一块地产。 现在,对于HumanPlayer对象,它需要从实际用户那里获取输入,以便例如购买地产,这似乎意味着不同的接口,并且可能意味着它们不应该派生
我没有想出一个好的解决方案来解决这个问题,而不必让Game类显式地知道各种Player类的实际实现。 我可以在Game类中做出假设,即只会有人类和计算机玩家,从而有效地关闭其扩展性,但这似乎不是良好的面向对象编程。
对此的任何意见将不胜感激。