语言无关 – 面向对象设计,开放/封闭原则问题

我一直在思考这个面向对象的设计问题已经有一段时间了,并且无法提出一个令人满意的解决方案,所以我想在这里向人群展示一些意见.

我有一个Game类代表一个基于回合制的棋盘游戏,我们可以假设它类似于Monopoly来解决这个问题.
在我的设计中,我有一个包含TakeTurn方法的Player类.

游戏循环遍历所有玩家,并调用TakeTurn方法完成所有必要的操作以完成转弯.
我希望能够拥有n个玩家,并能够将其中的任意数量设置为计算机玩家.
所以,我的想法是拥有一个HumanPlayer类和一个ComputerPlayer类,这两个类都派生自Player.

游戏只知道Player类,只是依次调用每个Player上的TakeTurn方法.
我的问题在于,ComputerPlayer对象可以完全自动化,即保持Monopoly示例,可以决定使用某种逻辑购买属性.
现在,使用HumanPlayer对象,它需要从实际用户那里获得输入以便能够购买一个属性,这似乎暗示了一个不同的接口,并且可能意味着他们不应该派生

如果Game类没有明确知道各种Player类的实际实现,我就无法找到解决问题的好方法.
我总是可以在Game类中假设只有人类和计算机玩家并且有效地关闭它以进行扩展,但它看起来不像是好的OO编程.

对此有任何意见将不胜感激.

我认为你不应该让Game类处理IO.
这样,(阻塞)TakeTurn方法将隐藏游戏板的实现手段.它可以使用其他对象与用户进行通信.

所有游戏类应关注的是棋盘状态和转弯状态.玩家都应该实现单个Player界面,并隐藏游戏中的所有实现.

相关文章
相关标签/搜索