加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d-x代理模式

发布时间:2020-12-14 21:22:54 所属栏目:百科 来源:网络整理
导读:前几天开始学习cocos2d-x,简单的搭建起环境后,进入它的main函数入口开始查看 // create the application instance AppDelegate app; CCEGLView * eglView = CCEGLView ::sharedOpenGLView (); eglView - setViewName( "haha" ); eglView - setFrameSize( 4
前几天开始学习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函数。 至此,就完成了整个函数的调用。 总结来说: 子类实现了父类的纯虚函数,而父类又在子类创建对象的时候完成了对自己的赋值,所以最终实现了父类调用了的子类实现的函数,这就是充分利用面向对象的多态思想。在父类定义纯虚函数作为接口,在子类完成实现,最终调用的就是各个子类的实现函数。 看起来是调用的父类,其实是实现了子类作为代理实现。实现了完全的解耦。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读