前几天开始学习cocos2d-x,简单的搭建起环境后,进入它的main函数入口开始查看
// create the application instance AppDelegate app; CCEGLVIEw* eglVIEw = CCEGLVIEw::sharedOpenGLVIEw(); eglVIEw->setVIEwname("haha"); eglVIEw->setFrameSize(480,320); return CCApplication::sharedApplication()->run();
发现它使用了24种设计模式中的代理模式。其中AppDelegate私有继承虚基类CCApplication:
class AppDelegate : private cocos2d::CCApplication
且只继承lCCApplication的部分函数,其实是3个:
/** @brIEf Implement CCDirector and CCScene init code here. @return true Initialize success,app continue. @return false Initialize Failed,app terminate. */ virtual bool applicationDIDFinishLaunching(); /** @brIEf The function be called when the application enter background @param the pointer of the application */ virtual voID applicationDIDEnterBackground(); /** @brIEf The function be called when the application enter foreground @param the pointer of the application */ virtual voID applicationWillEnterForeground();
其中applicationDIDFinishLaunching这个函数在AppDelegate.cpp文件中得到具体实现,applicationDIDFinishLaunching这个函数作为程序员进行程序开发真正的入口点函数,设计得尤为精巧。
紧接上面,AppDelegate私有继承CCApplication,并对CCApplication度外公共开放的函数接口做了对应实现,applicationDIDFinishLaunching就是我们需要实现的内容。
CCApplication又公共继承了纯虚基类CCApplicationProtocol
class CC_DLL CCApplication : public CCApplicationProtocol
其中对applicationDIDFinishLaunching的定义如下:
virtual bool applicationDIDFinishLaunching() = 0;
即把applicationDIDFinishLaunching定义成了纯虚函数,CCApplication作为一个虚基类,并没有对它进行具体实现,但是在run方法中对其进行了调用
if (!applicationDIDFinishLaunching()) { return 0; }
当AppDelegate实例化对象后,会先追溯到父类中的构造函数
CCApplication::CCApplication(): m_hInstance(NulL),m_hAcceltable(NulL){ m_hInstance = GetModuleHandle(NulL); m_nAnimationInterval.QuadPart = 0; CC_ASSERT(! sm_pSharedApplication); sm_pSharedApplication = this;}
在这里会对sm_pSharedApplication 进行赋值,为当前对象,即app
CCApplication在使用静态方法sharedApplication()获得调用自己的对象后(即app)
而AppDelegate 又对applicationDIDFinishLaunching进行了具体实现,所以main函数中
return CCApplication::sharedApplication()->run();
CCApplication::sharedApplication()即为当前对象app,由于applicationDIDFinishLaunching为纯虚基类,所以在调用run方法时
// Initialize instance and cocos2d. if (!applicationDIDFinishLaunching()) { return 0; }
调用applicationDIDFinishLaunching会直接调用AppDelegate实现的applicationDIDFinishLaunching函数。 至此,就完成了整个函数的调用。 总结来说: 子类实现了父类的纯虚函数,而父类又在子类创建对象的时候完成了对自己的赋值,所以最终实现了父类调用了的子类实现的函数,这就是充分利用面向对象的多态思想。在父类定义纯虚函数作为接口,在子类完成实现,最终调用的就是各个子类的实现函数。 看起来是调用的父类,其实是实现了子类作为代理实现。实现了完全的解耦。
总结以上是内存溢出为你收集整理的cocos2d-x代理模式全部内容,希望文章能够帮你解决cocos2d-x代理模式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)