2

我正在为视频游戏课程编写游戏(不幸的是,它什么也没教),我在设计游戏实体和实际运行游戏的类之间的交互时遇到了麻烦。

我的问题几乎可以归结为:假设一个实体有一个位置,它不应该直接修改它(而是必须等待游戏管理器运行一个游戏步骤),但它应该能够访问它,运行 AI 检查等。

我的解决方案是创建一个Position与 的朋友的类GameManager,并创建一个像这样的实体类

class Entity {
    public:
        Position & getPosition() { return pos_; }
    private:
        Position pos_;
};

所以经理可以修改实体的位置,但其他类只能观察。然而,这种推理适用于许多其他属性,并且由于实体类实际上派生为一系列子类,这些子类具有越来越多的属性,因此我friend几乎必须将属性放在任何地方。

解决这个问题的更好方法是什么?

4

1 回答 1

0

出于多种原因,将某些类标识为朋友而将某些其他类标识为非朋友的想法并不是一个好主意。这意味着,

如何使用这个类也是这个类的一个问题。

但这根本不是它关心的问题。这个类,无论是什么类,都应该被设计成履行自己的职责。

现在,根据您的情况,首先您应该决定改变位置的动作/行为属于哪里;它是否属于实体、实体管理器或其他东西。例如,这两种情况中哪一种更有意义:

  1. 实体将其位置从 x1 更改为 x2。
  2. 实体管理器将实体的位置从 x1 更改为 x2。

假设您确定此行为确实属于实体,而不是实体管理器(案例 1)。在这种情况下,正如@bengoesboom 在评论中指出的那样,它应该提供一个设置器,该类的用户可以使用它来更改其位置。

现在,如果您认为此类可能以不希望的方式使用,那么您应该在此类中强制执行约束和业务规则。例如(只是一个简单的例子),如果你想在一个操作中只允许某个范围的值。检查输入,如果不在范围内,则抛出异常。

曾经,您已经妥善处理了规则和约束,然后您就不会关心谁将使用这个类。

于 2013-06-05T18:36:31.000 回答