Widget 不是由手工创建的,是由三个工厂类类创建,组织,管理的。
这三个类分别为
抽象模板类工厂:
用来创建类实例
GenericFacotory
template <typename Type> class GenericFactory { public: typedef delegates::CDelegate1<IObject*&> Delegate; static typename Delegate::IDelegate* getFactory() { return newDelegate(createFromFactory); } private: static void createFromFactory(IObject*& _instance) { _instance = new Type(); } };无疑 FactoryManager类中的私有成员变量mRegisterFactoryItems 需要详细的分析:
首先:
typedef delegates::CDelegate1<IObject*&> Delegate;
展开其宏为:
转CDelegate1而言
public: typedef delegates::CDelegate1<IObject*&> Delegate;此处见识了一个没有用过的用法:
指针的引用: IObject * &
CDelegate1 主要用于Widget组件的建立:对应于IDelegate1
对于FactoryManager的IDelegate1 是通过GenericFactory 传入其具体代理方法
对于注册Widget创建的函数是通过FactoryManager下列member function 传入的:
对应template 方法:
template<typename Type> void registerFactory(const std::string& _category) { registerFactory(_category, Type::getClassTypeName(), GenericFactory<Type>::getFactory()); } template<typename Type> void registerFactory(const std::string& _category, const std::string& _type) { registerFactory(_category, _type, GenericFactory<Type>::getFactory()); }对应具体的cpp实现:
void FactoryManager::registerFactory(const std::string& _category, const std::string& _type, Delegate::IDelegate* _delegate) { //FIXME mRegisterFactoryItems[_category][_type] = _delegate; }
传入的 _delegate 为 IDelegate
但是mRegisterFactoryItems[_category][_type]为CDelegate1 类为什么不同的类可以互等,这是因为在CDelegate1 重写了=CDelegate1 <T, TP1> & operator=(IDelegate* _delegate) { delete mDelegate; mDelegate = _delegate; return *this; } CDelegate1 <T, TP1> & operator=(const CDelegate1 <T, TP1>& _event) { // забираем себе владение delete mDelegate; mDelegate = _event.mDelegate; const_cast< CDelegate1 <T, TP1>& >(_event).mDelegate = nullptr; return *this; }
这是在注册函数中可以采取的现实理由观察FactoryManager类成员变量,和成员函数可以得出其作用主要在于类初始化常见的注册工厂代理
至此我们打通了widget的创建之路,
继续有两个阶段性目标:
1)Widget的属性设置,和动态加载皮肤
2)Widget的渲染,结构和渲染管线。