C++ Liskov替换原理与游戏类设计
在我的游戏中,我定义了一个C++ Liskov替换原理与游戏类设计,c++,oop,solid-principles,C++,Oop,Solid Principles,在我的游戏中,我定义了一个屏幕类,其中包含对许多可视实体对象的引用,这些对象可能会被绘制到显示器上: class Screen { public: private: std::vector<Entity*> entities_; }; 屏幕负责在其每个实体上调用Draw()函数 问题是,一些(但不是全部)实体也需要可更新,即随着时间的推移,它们将改变其外观/位置。屏幕还需要调用Update()函数,但仅适用于可更新的对象 我的问题是: 从具有更新功能的实体派生类是否有意义:
屏幕
类,其中包含对许多可视实体
对象的引用,这些对象可能会被绘制到显示器上:
class Screen {
public:
private:
std::vector<Entity*> entities_;
};
屏幕
负责在其每个实体
上调用Draw()
函数
问题是,一些(但不是全部)实体
也需要可更新,即随着时间的推移,它们将改变其外观/位置。屏幕
还需要调用Update()
函数,但仅适用于可更新的对象
我的问题是:
从具有更新功能的
实体
派生类是否有意义:
class Entity {
public:
void Draw();
private:
int xpos;
int ypos;
};
class ChangingEntity : public Entity {
public:
void Update(int time);
};
并使屏幕
如下所示:
class Screen {
public:
private:
std::vector<Entity*> entities_;
std::vector<ChangingEntity*> changing_entities_;
};
类屏幕{
公众:
私人:
向量实体;
std::向量改变实体;
};
如果我执行上述操作,那么我只为每个实体
调用Draw()
,并对每个更改属性
调用Draw()
和Update()
或者-我应该把
Update()
函数放在Entity
中,如果一个Entity
对象不能更新,那么Update()
就没有实现了吗?这里有一些东西可以改进
最好不要让实体自己绘制,使用单独的draw()
函数或可绘制类()。在您当前的方法中,您正在创建任何需要绘图来扩展实体的类,下次您将发现一个类不需要是实体就可以绘图。因此,请使用单独的绘图函数
其次,您应该定义实体是什么,例如Ogre3D将定义为基于网格的离散、可移动对象的实例,我认为您当前的定义不够,它只包含位置和绘图功能。您可以将一个实体定义为一个可更新的对象,另一个名为StaticEntity
的类不需要多态性。让场景有两个单独的列表,并且实际上能够更新对象,再次将渲染器与场景分离
第三,您的
屏幕
类应该被称为渲染器
,并且可以根据静态类型注册渲染对象。您还可以有一个可绘制的界面。如果您知道如何静态地将两个容器分开,则可以将两个容器分开。多态性是指当你静态地不知道要使用哪种类型时。你怎么说“如果你知道如何静态地将这两种类型分开”…你是说我是否可以明确地将它们分开,并且事先知道它们是什么类型?如果是这样的话,那么我可以这样做。“从实体派生类有意义吗”--目前可能没有,因为Entity
并没有很好地设计用作基类。它有一个公共的非虚拟析构函数,这是个坏消息。对于基类,析构函数应该是虚拟的或受保护的。