我正在尝试实现一个模型(gfx)类,但是我似乎找不到一个合适的设计。
我目前拥有的是这个:[伪代码]
class Material {
public:
virtual void SetPerFrameInfo(void* pData)=0;
//[...]
}
class SpecificMaterial : public Material {
public:
void SetPerFrameInfo(void* pData);
//[...]
}
void SpecificMaterial::SetPerFrameInfo(void* pData) {
ThisMaterialPerFrameInfoStruct* pInfo = (ThisMaterialPerFrameInfoStruct*)pData;
//[...]
}
class Model {
public:
Model(Material* pMaterial){m_pMatirial = pMaterial;}
void Draw();
private:
Material* m_pMaterial
//[...]
}
void Model::Draw() {
PerFrameInformation info;
m_pMaterial->SetPerFrameInfo(&info);
}
如何使用它:
Material* pMaterial = new SpecificMaterial();
Model someModel(pMaterial);
你可能已经注意到,我有两个主要问题:
1)传递给SetPerFrameInfo()的结构体类型取决于实际的材质,那么我应该如何填写它呢?
2)根据实际的材质,Model类可能需要一些其他的数据成员,因为对于某些材料,我可能会决定实现一个计时器,而对于另一些材料,我可能不需要。在Model类中为所有材料都拥有数据成员将浪费内存。
请帮帮我,我似乎找不到任何合适的设计模式。
SetPerFrameInfo
的参数类型,它如何传递正确的对象?另一方面,如果它确实知道,您可以将参数类型从void *
更改为更具体的内容。 - Thomas