|
发表于 2020-2-12 12:45:01
|
显示全部楼层
我是个新手,多少懂点template,举个例子吧
首先一个template class例如
template<class T, class HandleType>
class StartThread
{
private:
..............;
public:
HandleType Run(T &t)
{
......;
return t.run();
}
};
这个template class 的意思是说要这个T 具有一个返回值为 HandleType run();的成员函数
你可以把这段.....; return t.run();这部分代码用到你的库的linux版本或者win32版本等等,它只跟 run();这段文本有关(宏也可以)
但是你换成OO的话就是这个样子:
#if defined (_WIN32)
typedef void* MyLibHandle;
#else
typedef int MyLibHandle;
#endif
class AbstractRunnerable
{
virtual MyLibHandle run() = 0;
};
class StartThread
{
public:
MyLibHandle Run(AbstractRunnerable & t)
{
.....;
return t.run();
}
};
这只是个小例子,可能其它人有更优雅的OO方法.
我个人觉得不论是OO的运行时多态还是GP的编译时多态,都提供的是一种类似控制反转似的功能.
归根到底都是这个GP StartThread 或者OO StartThread只能保证一部分代码是固定的,他们都不具有完整的行为,需要外部类型来填充,继承AbstractRunnerable或者
StartThread<Runner> 的意思都是填充一个行为;我认为理论上说选择哪个都是无所谓的事情, 但这说的只是一些基础的库,他们的流程是基本固定的,例如vector,list,或者thread, 他们的流程大多数是固定的,例如排序等等,只需要注入一个operator<等等就OK;GP更适合表述流程概念.设计模式的template模式差不多就是这个道理;
但是在大多数软件开发中不断改动的可能是流程,这时候GP提供的封装流程(算法)的功能用处就不大了,用OO完全可以表述清楚一个类型了,为何非要GP呢?
|
|