设为首页 加入收藏

TOP

让C++支持interface
2013-01-01 14:50:40 来源: 作者: 【 】 浏览:377
Tags:支持 interface

    在正题的展开前,我们先来看一段C++(www.cppentry.com)代码:

    class IX {

    public:

    virtual void Fx1() = 0;

    virtual void Fx2() = 0;

    };

    这是一段简单的接口声明代码:IX是用于实现接口的纯抽象基类.纯抽象基类指的是仅包括纯虚函数的基类.纯虚函数是指用=0标记的虚函数,我们往往把=0称作纯虚函数指示符.

    虚基类是不能实例化的,换句话说,虚基类只是提供一个interface的功能,它并不实现这些纯虚函数.这让我们想起C#/Java语言里面的interface关键字,interface和class不同,interface仅有接口声明,而且所有的声明默认的访问权限是public而非private,这让我们可以用C++(www.cppentry.com)的struct来模拟interface,因为struct默认的访问权限也是public.

    让我们简单的加一个约定:

    #define interface struct

    使用struct的原因在于struct的成员将自动具有公有的属性,因此不需要另外在定义加上public关键字.去掉public关键字可以减少一些混乱.根据这个约定,我们开始的代码可以重新定义如下:

    interface IX {

    virtual void Fx1() = 0;

    virtual void Fx2() = 0;

    };

    可以看到,少了public,减少了混乱.同时interface可以透露出,这不是一个普通的class,而是一个接口.

    下面我们模拟一个有两个接口的组件component的简单访问

    //Filename: base.hpp

    #define interface struct

    //Filename: IFace.cpp

    #include<iostream>

    #include“base.hpp”

    //在linux终端以红色打印pMsg字符串

    void trace(const char* pMsg) { std::cout<<“\033[0;31m”<< pMsg <<“\033[0m”<<std::endl; }

    // Abstract Interfaces

    interface IX {

    virtual void Fx1() = 0;

    virtual void Fx2() = 0;

    };

    interface IY {

    virtual void Fy1() = 0;

    virtual void Fy2() = 0;

    };

    // Interface implementation

    class CA : public IX,public IY {

    public:

    // Implement interface IX.

    virtual void Fx1() { std::cout<< “CA::Fx1” <<std::endl; }

    virtual void Fx2() { std::cout<< “CA::Fx2” <<std::endl; }

    //Implement interface IY.

    virtual void Fy1() { std::cout<< “CA::Fy1” <<std::endl; }

    virtual void Fy2() { std::cout<< “CA::Fy2” <<std::endl; }

    };

    //client

    int main() {

    trace(“Client:Create an instance of the component.”);

    CA *pA = new CA;

    //Get an IX pointer

    IX* pIX = pA;

    trace(“Client: Use the IX interface.”);

    pIX->Fx1();

    pIX->Fx2();

    //Get an IY pointer

    IY* pIY = pA;

    trace(“Client: Use the IY interface.”);

    pIY->Fy1();

    pIY->Fy2();

    trace(“Client: Delete the component.”);

    return 0;

    }

    程序运行结果:

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇对C和C++语言内存的理解 下一篇静态的声明一个指针变量

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: