使用虚函数,减少累赘的ifelseswitch
假设我们有不同的对象需要管理,我们可能建立一个类来包装一下实现对这些不同类型对象的管理,比如
class CObjManager
{
public:
bool addObj_A(string const & strObjName,Other_params…);
bool addObj_B(string const & strObjName,Other_params…);
…….
bool updateAllObj();
}
用add函数将对象添加到管理器内,然后在更新对象时,用updateAllObj()更新对象的数据,这么的话,update可能需要这么写
bool CObjManager::updateAllObj()
{
for(i=0 to num of object)
{
switch(object.type)
{
case A:
…
break;
case B:
…
break;
…
}
}
}
我们可以这样使用这个管理器:
CObjManager objManager;
objManager.addObj_A(“This is object A”,others…);
objManager.addObj_B(“This is object B”,others…);
在需要更新对象时,执行
objManager.updateAllObj()
即可
有没有觉得CObjManager::updateAllObj函数写得太难看了,尤其是当对象类型很多时更是如此。
下面看用虚函数怎么做这件事,完全不用这么多switch
首先定义一个对象的虚基类
class CObjBase()
{
public:
CObjBase(string const & strObjName);
virtual bool update()=0;
}
其中uodate为对象的更新函数,对于对象A来说,可以这么写
class CObj_A():public CObjBase
{
public:
CObj_A(string const & strObjName,Other_params…):CObjBase(strObjName)
{…}
virtual bool update()
{
…
}
}
然后写一个对象管理器,如下
class CObjManager
{
public:
bool updateAllObj()
{
for each obj
obj.update();
}
bool addObj(CObjBase * pObj);
~CObjManager()
{
for each object
delete object
}
}
看到没有,这里的updateAllObj完全不用管对象具体是哪一个类型,这些繁琐的事情让c++干吧!
可以这么使用这个对象管理器
CObjManager objManager;
objManager.addObj(new CObj_A(“This is Obj A”,..other param..));
objManager.addObj(new CObj_B(“This is Obj B”,..other param..));
在需要更新对象时,执行
objManager.updateAllObj()
即可
看,用起来还是很方便,但是看起来写起来却漂亮了很多,当需要增加新的类型时,只需要添加一个类就行了。。。