前言:
在编制稍微大型的类时,为了使类更加灵活,通常需要加入很多的成员变量,这样做会很有弊端,因为如果需求发生了变化,那么类里的成员变量也会发生变化,这样就导致了该类需要重新编译,那么应用程序中与该类相关的所有有联系的类(即使用了该类的头文件)都必须重新编译过,这样会带来潜在的错误风险。
一.目标
既然现代的编程方法强调可重用和可扩展,那么我们现在就可以先来尝试一下怎样在:
1. 不需要修改接口
2. 类型无关(即能接受任意类型)
二.设想
如果接触过vb,那么vb里面使用的collection应该不会陌生,据了解应该是使用safarray和Varaiant,而我们今天需要使用其他的途径来实现它。
1.通过形如"PropertyBag['ServerName'] = 'localserver'"的方式实现调用。
2.通过形如"PropertyBag[SERVER_NAME]='localserver'"的方式实现调用。
在第二种方式中使用的是预先定义的参数标号作为索引,这种方法在速度上比第一种迅速,但是从扩展性的角度上看是不能满足我们的目标的。
所以我们来尝试第一种方案。
最后完成的调用方式如下:
CPropertyBag bag;
bag["ServerPort"] = CProperty<int>(80);
bag["ServerName"] = CProperty<string>("localhost");
...
int iSvrPort = CProperty<int>(bag["ServerPort"]);
string sSvrName = CProperty<string>(bag["ServerName"]);
任何类型采用即用即实现转化的过程
三.设计
1.属性包嘛,为了与类型无关,必须与所有类型都兼容,那就剩下void*了,在这里我们可以使用vector<char>作为一种载体存放在CDataCan里面
class CDataCan
{
...
vector<char> m_data; // store data
string m_sType; // store typename, come from typeid(...).name
}
class CPropertyBag
{
...
CDataCan m_data;
...未完...