【问题标题】:How can I make a class implement an interface .... (C++)我怎样才能让一个类实现一个接口....(C++)
【发布时间】:2015-03-21 21:56:19
【问题描述】:

...当类确实提供了所有抽象方法的实现,但没有“正式”实现接口时?

假设我有以下内容:

class AInterface {
    public:
        virtual void mem_func()=0;
        virtual ~AInterface(){}
};

void AFunction(AInterface* i){};

class BClass {
    public:
        void mem_func(){}
        virtual ~BClass(){}
};

我无法更改任何内容,但我想使用 BClass 类的对象来调用 AFunction。

其实我也想写类似

class MyABClass : public BClass,public AInterface {};

但这并没有帮助(该类只是继承了这两个方法并且是抽象的)。我想这样做的一种方法是写类似

class MyABClass : public AInterface {
    public:
        void mem_func(){a.mem_func();}
    private:
        BClass a;
}

这很好,但我想知道是否可以节省一些写作,或者是否有更好的方法来处理这种情况。

【问题讨论】:

  • 您想要实现什么,或者这只是对 C++ 中 OOP 的一般探索?看起来您正在尝试实现 Mixins,但我不太确定。
  • 为什么不只是class MyClass : public AClass {}
  • 我不认为你可以随心所欲。假设 AInterface::A() 不是纯虚拟的,当你调用 MyClass::A() 时编译器不知道要调用哪一个。如果 AInterface::A() 是纯虚函数,编译器需要先找到 A()。
  • @πάνταῥεῖ AInterface 是纯抽象的(否则我不会称它为“接口”:P)。但是,即使不是,我也不太理解您的评论。但是,我将不得不看一下,如果我不明白,那将是一个不同的问题。
  • @MorphingDragon 也许使用 mixins,可以更优雅地处理这种情况,但我的问题实际上是关于(从某个地方)给出 AInterface、AFunction 和 AClass 而不能直接更改它们中的任何一个。实际上,我正在考虑编写一个可以将任何类作为参数的模板,并通过简单地将调用转发到模板参数类调用来实现 AInterface。我想这会朝着 mixins 的方向发展。

标签: c++ oop abstract-class multiple-inheritance


【解决方案1】:

我将使用与您上一个代码 sn-p 非常相似的方法

class MyABClass : public AInterface {
    public:
        void MyABClass(BClass &_a)
            : a(_a)
        {}
        void mem_func(){a.mem_func();}
    private:
        BClass &a;
}

这是一种设计模式,称为Adapter(带委托)。也许您还想了解Proxy 模式。

更新(考虑 Kenny 的评论):您是否将 BClass 作为参考或副本传递是有争议的。这取决于你想要什么。如果您想要一个包装器来方便地更改原始 BClass 实例,请使用 BClass & 作为构造函数参数。另一方面,如果副本足够,则仅使用 BClass 而不使用与符号 &。好吧,if 可以使用复制构造函数。最后,在使用引用时必须注意可能会产生副作用(同样,可能需要也可能不需要)。

【讨论】:

  • 是的,在某些情况下,使用默认构造的 AClass 对象会使我的 sn-p 相当无用。感谢您指出这是一种设计模式。我总是觉得使用一些完善的模式而不是我自己的“我以某种方式让它工作”的解决方案感觉更好;)
  • 命名设计模式的加分项,但不要使用参考。正如您的链接所示,代理应该拥有私有实例,或扩展类以使其成为实例(这使其成为另一个等效答案,多重继承)。
【解决方案2】:

你的第一次尝试几乎是正确的

class MyClass : public AClass,public AInterface {};

问题是 MyClass 不知道 AClass::A() 满足 AInterface::A()=0 提出的要求。像这样给它一点帮助

class MyClass : public AClass, public AInterface {
    void A() {AClass::A();}
};

【讨论】:

  • @tobi303 - 您的多重继承代码几乎是正确的。这纠正了它缺少的一个小细节。
  • 在阅读了您的帖子和之前的编辑后,我知道您的意思,但我认为如果有人阅读我的问题和您的答案,您所指的代码并不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 2014-12-25
相关资源
最近更新 更多