代码改变世界

使用模板来解决接口继承问题

2013-11-04 20:14 by Clingingboy, ... 阅读, ... 评论, 收藏, 编辑

 

一.定义2个有继承关系的接口

struct IA
{
    virtual void Test1()=0;
};

struct IB:public IA
{
    virtual void Test2()=0;
};

二.定义2个类来实现

class A:public IA
{
    virtual void Test1() {}
};

class B:public IB
{
public:
    virtual void Test2() 
    {

    }
};

类B将无法使用,必须重新实现IA的Test1方法,如下代码

class B:public IB
{
public:
    virtual void Test2() {}
    virtual void Test1() {}
};

这样的做法使得接口继承非常麻烦

三.使用模板来实现接口单继承

c#和java都是可以单类和多接口继承,c++则可以多个类继承,这使得多继承设计上带来麻烦,尽量使用单继承来避免问题.

先看一个非模板的实现

class CA: public IB
{
public:
    virtual void Test1() {}
};

class CB:public CA
{
public:
    virtual void Test2() {}
};

以上的定义,CB可以声明,CA则会编译错误,根据上面的思想,可以将其改造为模板版本

template<class IActual>
class CA: public IActual
{
public:
    virtual void Test1() {}
};

template<class IActual>
class CB: 
    public CA<IActual>
{
public:
    virtual void Test2() {}
};

template<class IActual>
class CC: public CB<IC>
{
public:
    virtual void Test3() {}
};

测试代码:

int main()
{
    CB<IB> b;
    CC<IC> c;
    IB *p=dynamic_cast<IB*>(&b);
    p->Test2();
    return 0;
};