问题情节(有点抽象,但回答这个问题将帮助我在我的真实应用程序中):
所以,我有一些可以在屏幕上呈现的对象的抽象超类。我们称之为IRenderable
。
struct IRenderable {
// (...)
virtual void Render(RenderingInterface& ri) = 0;
virtual ~IRenderable() { }
};
并且假设我还有一些来自IRenderable
的其他对象,例如Cat
和Dog
。
到目前为止一切顺利。我添加了一些Cat
和Dog
具体方法,例如SeekForWhiskas(...)
和Bark(...)
。之后我为它们添加了特定的Render(...)
方法,所以我的代码看起来像这样:
class Cat : public IRenderable {
public:
void SeekForWhiskas(...) {
// Implementation could be here or moved
// to a source file (depends on me wanting
// to inline it or not)
}
virtual void Render(...) {
// Here comes the rendering routine, that
// is specific for cats
SomehowDrawAppropriateCat(...);
}
};
class Dog : public IRenderable {
public:
void Bark(...) {
// Same as for 'SeekForWhiskas(...)'
}
virtual void Render(...) {
// Here comes the rendering routine, that
// is specific for dogs
DrawMadDog(...);
}
};
然后我可以在其他地方绘制适当的渲染例程的方式:
IRenderable* dog = new Dog();
dog->Render(...);
我的问题是这种代码的逻辑包装。
我想拆分代码,这对应于渲染当前对象及其自己的方法(本例中为Render
和Bark
),因此我的类实现不会变成一团糟(想象我有10个方法,如Bark
,当然我的Render
方法不适合他们的公司,很难找到。
我想要的两种方式(据我所知)是:
制作看似RenderCat(Cat& cat, RenderInterface* ri)
的适当例程,将它们连接到render
命名空间,然后类中的函数看起来像
virtual void Render(...) { RenderCat(*this, ...); }
,但这很简单,因为我将失去对Cat
私人会员的访问权限,并且这些功能看起来像是一场彻底的设计灾难。
使用访问者模式,但这也意味着我必须重建我的应用程序的设计,看起来似乎不适合从一开始就使我的代码变得复杂。
有什么好主意吗? :)
答案 0 :(得分:1)
我对图形编程的理解和回忆是访客确实合适。
答案 1 :(得分:1)
就个人而言,我会说只是智能地对文件中的函数进行排序,而且大部分都会覆盖它,但这听起来并不像你正在寻找的那样。
您总是可以将与显示相关的内容放在一个类中,将非显示内容放在另一个类中并使用多重继承。由于MVC设计模式,将GUI内容与逻辑分离是非常典型的。这通常是一种很好的做事方式,但我不知道它对你正在做的事情有多好。
另一种可能性是将函数定义放在单独的文件中。没有什么要求你将一个类的所有函数定义都放在一个文件中。而不是Dog.cpp,你可以拥有Dog.cpp,其中包括Dog_DisplayFunctions.cpp和Dog_ActionFunctions.cpp或类似的东西。