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

c – 指向组合接口的指针 – 指向实现一个接口并从另一个接口的

发布时间:2020-12-16 07:20:18 所属栏目:百科 来源:网络整理
导读:我有两个接口: class FirstInterface{ virtual int getId() const = 0;};class SecondInterface{ virtual void setId(int id) = 0;}; 这是一个组合的界面: class CombinedInterface : public FirstInterface,public SecondInterface{}; 这是第一个接口的具
我有两个接口:

class FirstInterface
{
    virtual int getId() const = 0;
};

class SecondInterface
{
    virtual void setId(int id) = 0;
};

这是一个组合的界面:

class CombinedInterface : public FirstInterface,public SecondInterface
{

};

这是第一个接口的具体类:

class FirstConcrete : public FirstInterface
{
    virtual int getId() const
    {
        return 1;
    }
};

现在,这个类CompleteConcrete应该具有CombinedInterface但是想要同时重用FirstConcrete的实现.

class CompleteConcrete : public FirstConcrete,public SecondInterface
{
    virtual void setId(int id) { }
};

// This is wrong C++
// Cannot convert from CompleteConcrete * to CombinedInterface *
// CombinedInterface * combinedInterface = new CompleteConcrete();

这当然不起作用.有谁知道在C ??中实现这一目标的方法?

解决方法

这是我在评论中提到的基于虚拟继承的解决方案:

class FirstInterface
{
    virtual int getId() const = 0;
};

class SecondInterface
{
    virtual void setId(int id) = 0;
};


class CombinedInterface : virtual public FirstInterface,virtual public SecondInterface
{

};

class FirstConcrete : virtual public FirstInterface
{
    virtual int getId() const
    {
        return 1;
    }
};

class CompleteConcrete : virtual public FirstConcrete,virtual public CombinedInterface
{
    virtual void setId(int id) { }
};

void example()
{
    CombinedInterface * combinedInterface = new CompleteConcrete();
}

对于虚拟继承,唯一需要的改变(除了房间里的大象)是使用CombinedConcrete从CombinedInterface而不是SecondInterface进行多重继承.你可以这样想:在图片中使用CompleteConcreate,它现在支持CombinedInterface,而不仅仅是添加SecondInterface.

有些人对虚拟继承感到不满.我不.它是C的独特功能之一,没有其他高级语言共享,TMK.它是一个非常强大的工具,可以解决某些难以在其他方面解决的问题.虚拟继承的两个主要缺点是:

>因为它非常强大,很容易被滥用,并导致各种问题.
>如果虚拟继承的类具有非默认构造函数,则很快就会变得很痛苦,因为实际上继承某些东西的每个类现在都负责构造它.

但只要正确使用虚拟继承,并且所涉及的类可以自己构建,虚拟继承就是一个有用的工具.

附:我还会提到一个刚想到的另一种替代解决方案.如果你说你的CombinedInterface只是为了某些特定的功能需要它,比如:

void somefunction(CombinedInterface &object);

您的功能需要一个组合界面.

做一个小改动:

void somefunction(FirstInterface &first,SecondInterface &second);

并将相同的对象作为两个参数传递.您可以传递实现两个接口的CompleteConcrete,而无需对类层次结构进行任何更改.您还可以使用模板外观,使其看起来像函数仍然需要一个参数:

template<typename T> void somefunction(T &&t)
{
    real_somefunction(std::forward<T>(t),std::forward<T>(t));
}

void real_somefunction(FirstInterface &first,SecondInterface &second);

你几乎可以摆脱CombinedInterface,只需将实现两个接口的任何对象传递给somefunction(),你的real_somefunction()将使用一个或另一个参数来调用适当的接口.

假设您需要携带指向实现两个接口的对象的指针?

class combined_pointer : public std::pair<FirstInterface *,SecondInterface *> {

public:
    template<typename T> combined_pointer(T *t)
            : std::pair<FirstInterface *,SecondInterface *>(t,t)
    {}
};

只是一个起点.

(编辑:李大同)

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

    推荐文章
      热点阅读