写了一个小东西,用于实现DataProxy机制,暂时还处于试验阶段:
class TestDataObjectDeclaration : public Test
{
public:
TestDataObjectDeclaration();
public:
virtual bool RunTest();
};
const int DEFAULT_VALUE_OF_BASE_X = 4;
const int DEFAULT_VALUE_OF_X = 5;
class MyBaseObject
{
public:
MyBaseObject() : _x(DEFAULT_VALUE_OF_BASE_X)
{}
public:
int _x;
};
class MyDataObject : public MyBaseObject, public archer::oi::DataObject<MyDataObject, MyActionProxy>
{
public:
MyDataObject() : _x(DEFAULT_VALUE_OF_X)
{}
public:
int _x;
public:
const type_info& func()
{ return ((const archer::oi::rtti_derived_class<MyDataObject>&) this->GetRuntimeTypeInfo()).typeidof(); }
};
DECLARE_RTTI(MyDataObject)
DECLARE_SIMPLE_RTTI_ITEM_OF_BASE(MyDataObject, MyBaseObject, _x, int, 0, "b_x")
DECLARE_SIMPLE_RTTI_ITEM(MyDataObject, _x, int, 1, "x")
END_DECLARE_RTTI
TestDataObjectDeclaration::TestDataObjectDeclaration() : Test("testDataObjectDeclaration") {}
bool TestDataObjectDeclaration::RunTest()
{
MyDataObject obj = MyDataObject();
char buffer[256];
sprintf(buffer, "size of MyDataObject: [%d]", sizeof(MyDataObject));
this->PromptMessage(buffer);
if (!AssertEquals(std::string(obj.func().name()), std::string("class MyDataObject"), "Get wrong type id from rtti."))
return false;
if (!AssertEquals(DEFAULT_VALUE_OF_X, obj.GetData<int>(1), "Failed to get data by rtti."))
return false;
if (!AssertEquals(DEFAULT_VALUE_OF_BASE_X, obj.GetData<int>(0), "Failed to get data of base class by rtti."))
return false;
const int CHANGED_VALUE = 10;
obj.SetData<int>(1, CHANGED_VALUE);
obj.SetData<int>(0, CHANGED_VALUE);
if (!AssertEquals(CHANGED_VALUE, obj.GetData<int>(1), "Failed to set data by rtti."))
return false;
if (!AssertEquals(CHANGED_VALUE, obj.GetData<int>(0), "Failed to set data of base class by rtti."))
return false;
return true;
}
优点是用户类MyDataObject的代码侵入很少,DataObject类可以用于多继承。data member的调用已经很类似于script语言了,GetData,SetData还可以按name查找。
缺点是data member必须为public,以及类似script语言的效率低的问题。目前rtti中,data member的声明是放在一个列表里,每次GetData, SetData时需要对列表遍历。还没有想到什么改进的办法,hash表当然是可以的,弄两个hash表把每个rtti_item存起来。但更希望有template直接的解法。
==============================================================================
早上起来花了点时间,把上面提的关于效率问题的功能实现了。现在
GetData和SetData分别变成了
GetData<0, int>();
和SetData<0, int>(CHANGED_VALUE);
而用name做index似乎是无法模板化的。所以name的list查找机制依旧保留。
分享到:
相关推荐
24. **HttpProxy类**、**MemoryProxy类**、**ScriptTagProxy类**:具体的DataProxy实现,分别对应不同的数据加载方式。 25. **Ext.data.DataReader类**:解析服务器返回的数据,如ArrayReader、JsonReader、...
单独使用时可实现局域网内据库之间的同步/集成,亦可与数据总线服务器配合使用实现Internet内跨地域数据库之间的同步/集成。特点:无需编程、两数据库字段不同可转换等。例如:进销存系统与财务系统之间的数据库同步/...
单独使用时可实现局域网内据库之间的同步/集成,亦可与数据总线服务器配合使用实现Internet内跨地域数据库之间的同步/集成。特点:无需编程、两数据库字段不同可转换等。例如:进销存系统与财务系统之间的数据库同步/...
**JavaScript 实现数据双向绑定** 数据双向绑定是前端开发中的一个重要概念,它使得视图(View)和模型(Model)之间的数据保持同步,当模型改变时,视图自动更新,反之亦然。这一特性在现代Web应用框架如Angular、...
通过阅读和理解给出的"extjs5DragDemo"压缩包中的代码,我们可以看到具体实现的细节,如拖放配置、事件处理函数、DataProxy的定义等。这对于开发者调试和定制自己的拖放功能非常有帮助。 总之,理解并实现ExtJS 5中...
registerProxy(new DataProxy()); registerMediator(new MyMediator()); // 注册其他核心组件... } } ``` - **初始化Façade**:通常在应用程序启动时初始化Façade,以确保所有核心组件都已正确注册。 **2. ...
Flex组件拖拽框架是一种在Adobe Flex环境中实现的交互设计技术,允许用户通过鼠标操作将组件在界面上自由移动,从而提升用户体验和应用的可操作性。这个框架通常由一系列类和方法组成,用于处理拖放事件,跟踪鼠标...
.getArray(value => new KeyValuePair<diantou.dataProxy.user, int>(diantou.dataProxy.user.get(value.Key), value.Value.Count)) .group(value => value.Key.grade0) .getArray(value => new userStat { ...
- **DataProxy**:作为数据采集和消息队列之间的中间层,负责数据的路由、压缩和协议转换等功能。 - **容灾机制**:当消息队列出现异常时,DataProxy能够将数据缓存到本地磁盘,确保数据不会丢失。 - **时延优化**:...
`Store`是ExtJs中的数据容器,它可以连接到DataProxy,DataProxy负责从服务器获取数据。在动态加载的情况下,通常使用`AjaxProxy`,因为它可以异步请求数据。同时,我们需要定义`Model`来描述数据结构,这里对应的是...
- 编写代码实现所需功能,通常是一个简单的SQL查询。 - 检查语法错误并激活函数模块。 - 最后,释放函数模块使其可在SAP.NET Connector中使用。 #### 二、安装与配置SAP .NET Connector ##### 1. 安装SAP .NET ...
在微信小程序中,我们可以创建一个单独的数据管理模块,如`dataProxy.js`,在这个模块中,我们可以定义数据的获取、设置和监听方法。例如,我们可以定义一个`get`方法用于读取数据,一个`set`方法用于更新数据,还有...
EXT3.2的DataProxy和DataReader/Writer则负责数据的序列化和反序列化,实现了JSON、XML等多种数据格式的处理。 总的来说,EXT3.2是一个强大的JavaScript库,提供了丰富的UI组件和数据管理工具。通过深入研究源码、...
7.7 DataProxy 208 7.8 DirectStore 209 7.9 DataWriter 212 7.10 Ext.data.Api 212 7.11 本章小结 213 第三部分 Ext-UI 第8章 Ext用户界面控件 216 8.1 布局 216 8.1.1 在FormPanel中使用HBoxLayout进行布局 216 ...
你可以通过为TreeNode添加扩展属性,如`href`和`hrefTarget`来实现这一功能。例如: ```javascript var node = new Ext.tree.TreeNode({ text: '节点文本', href: 'http://example.com', hrefTarget: '_blank' }...
本部分讲述了Ext.data相关类的使用,包括Ext.data.DataProxy、Ext.data.DataReader和Ext.data.Store类,以及如何实现下拉列表框,如何获取下拉列表框的值。 ### 第十部分:Ajax与ComboBox 在ExtJS中,Ajax的使用...
4. **Model和DataProxy**:模型(Model)用于封装业务数据,DataProxy则负责与数据源通信。这部分内容将解释它们如何协同工作,确保数据的正确性和一致性。 5. **视图(View)与控制器(Controller)**:在MVC模式下,...
- **Proxy**:这个目录下可能包含了`Proxy`子类,例如`DataProxy`,它负责与数据源交互并管理数据。 - **Mediator**:可能包含如`MainWindowMediator`这样的类,它实现了对UI组件的监听和交互。 - **Command**:这里...
Ext.data.Store需要与数据代理Ext.data.DataProxy配合,后者定义了从内存或网络获取数据的方式。同时,Ext.data.DataReader负责将原始数据转换为Store可以使用的形式,而Ext.data.DataWriter则负责将数据保存到...