我一直想知道我在游戏引擎和游戏中使用了相当长一段时间的设计。假设我们有一个 Object 类
class Object
{
public:
const std::string& getName() { return m_name; }
private:
std::string m_name;
}
Run Code Online (Sandbox Code Playgroud)
然后,我有一个名为 ObjectManager 的类,它保存一个 Object 实例。现在,我一直在想是否应该在 ObjectManager 中将该实例保留为私有并重复代码,以便它可以调用 getName(),或者将 Object 设为公共,这违背了封装的概念。大家觉得哪种设计更好呢?
谢谢你的帮助!
如果您的类包含可供其他人使用的对象,请公开它。封装的目的是隐藏做某事所需的变量。某些数据成员不属于这种情况。
例子:
人汤姆;
tom.getEyes().getColor();
tom.getMouth().eat(tomato);
tom.legs().walk();
Run Code Online (Sandbox Code Playgroud)
Person 可以隐藏所有内容,但这会很麻烦:
tom.getEyesColor(); // accessor for every eye feature
tom.eat(tomato);
tom.walkAndEat(); // every possible combination of actions
Run Code Online (Sandbox Code Playgroud)
进一步的例子:
grid.row(3).col(5).setText("hello");
Run Code Online (Sandbox Code Playgroud)
这里,列类可以公开许多方法,而无需触及网格类。这就是面向对象编程的美妙之处。
如果您将您的类命名为 ObjectManager,我感觉它正在为其他人管理对象实例,因此您应该公开它。使用继承的另一个想法也是有效的:
class ObjectManager : public Object
{
};
Run Code Online (Sandbox Code Playgroud)