先说一下background
前段时间想实现一个Sqlite localstorage的功能,对应不一样的Model 实体有不一样的table, 每一次sql操做的函数签名中会有model实体中的struct结构做为参数,struct彻底不一样,没法抽象,如何实现呢?sql
方式1:
每一次操做实现一个函数,如update table1(model struct1) / update table2(model struct2), 这样实现也有好处,简单明了,每一个函数签名表明了最最直接的操做,最后把全部的函数签名集合到一个大文件中暴露出来便可,数据库
全部数据库的操做也只有该大文件一个入口; 缺点是每一个函数中大量重复逻辑很差抽离,感受有点Low。ide
方式2:函数
一旦以为有重复逻辑,抽象就会天然而然萌生。简单粗暴,重复逻辑抽离为单独函数,这只是封装的思想,不过确实也能解决一些问题,只是对该场景感受用处不大。this
再有就是抽离接口,抽象基类,找到共通点,这应该是大多数的想法,也是我写程序常常思考的方式。可是又有问题,这些函数签名都不一样(model struct不一样),override没有意义,简单的继承根本解决不了问题。localstorage
方式3:sqlite
模板,这确实是一种抽象能力,每每要求更高(我是不太会用模板),大量的开源项目几乎都是模板,彷佛扯远了。。。。对象
不一样的model structk能够用模板来抽象,可是对应的处理逻辑又是不一样的(忽然想到了什么,咦,这不是虚函数干的事吗),又回到了方式2的问题blog
方式2 & 方式3:继承
模板继承,base中转化为特定的子类,因而有了下面的代码
template<typename TableType, typename RowType> class SqliteTable { } template<typename TableType, typename RowType> template<typename KeywordType> bool SqliteTable<TableType, RowType>::execDeleteRowByKeyword(CppSQLite3DB* sqliteDB, const std::string& columnName, const KeywordType& keyword) { // convert base to child spefic instance return static_cast<TableType*> (this)->execDeleteRowByKeyword<KeywordType>(sqliteDB, columnName, keyword); }
主要其实就是在父类中直接转化为子类的对象,在编译期就实现了多态,不一样于虚函数的运行期