我正在为一个视频游戏课程编写一个游戏(不幸的是什么都没教),我在设计游戏实体和实际运行游戏的类之间的交互方面遇到了麻烦。
我的问题在很大程度上减少了:假设一个实体有一个位置,它不应该能够直接修改它(而是必须等待游戏经理运行一个游戏步骤),但它应该能够访问它,运行AI检查等等。
我的解决方案是创建一个与Position
成为朋友的GameManager
类,并创建一个像这样的实体类
class Entity {
public:
Position & getPosition() { return pos_; }
private:
Position pos_;
};
因此,经理可以修改实体的位置,但其他类只能观察。然而,这种推理将适用于许多其他属性,并且由于实体类实际上派生为一系列具有越来越多属性的子类,因此我必须将friend
属性放在几乎所有位置。 / p>
解决这个问题的更好方法是什么?
答案 0 :(得分:0)
出于多种原因,将某些类别识别为朋友而将某些其他类别识别为非朋友的想法并不是一个好主意。这意味着什么,
如何使用此课程也是本课程的一个关注点。
但这根本不是它的关注点。无论正在考虑什么课程,这门课程都应该设计为自己负责。
现在,根据您的情况,首先您应该决定改变位置的行为/行为所属的位置;它是否属于实体,实体管理器或其他内容。例如,这两种情况中的哪一种更有意义:
假设您确定此行为确实属于实体,而不是实体管理器(案例1)。在这种情况下,正如@bengoesboom在评论中指出的那样,它应该提供一个setter,该类的用户可以使用它来改变它的位置。
现在,如果您认为此类可能以不需要的方式使用,那么您应该在此类中强制执行约束和业务规则。例如(只是一个简单的例子),如果你想在一个操作中只允许某些范围的值。检查输入,如果它不在范围内,则抛出异常。
有一次,你已经妥善处理了规则和约束,那么你不关心谁将使用这个类。