语义 - 将已实现的接口传递给方法

时间:2013-12-25 23:06:04

标签: java c++ c++11

考虑以下界面:

class MyInterface
{
   virtual bool test(void * param) = 0;
}

可以做这样的事情来实现界面吗?

MyInterfacemyInterface = new MyInterface()
{
   bool test(void * param)
   {
        return true;
   }
}

myClass.setInterface(myInterface);

----- OR -----

myClass.setInterface( new MyInterface()
{
   bool test(void * param)
   {
        return true;
   }
} );

PS:此方法是用Java完成的。想知道C ++中类似的东西。

4 个答案:

答案 0 :(得分:2)

最接近内联接口实现的java等价物是将私有类放入编译单元:

#include "MyInterface.hpp"

namespace {
    struct MyInterfaceImpl : public MyInterface {
        virtual bool test(void * param)
        {
            return true;
        }
    };
}

并在此文件的其他位置使用它(例如,从堆栈本地实例)。

答案 1 :(得分:2)

大多数情况下,这种模式在Java中用于事件处理/回调目的。如果它接近你的用例,那么考虑这样的事情:

class Widget {
  std::function<void()> _callback;

  void setCallback(std::function<void()> callback) { _callback = callback; }

  void fireCallback() { if(_callback) _callback(); }
}

在遥远的星系中:

int main() {

     Widget *pw = new Widget();

     auto callbackFunction = []() { alert("called back!"); } // C++ lambda

     pw->setCallback( callbackFunction );
     ....
}

如果需要,Widget实例可能会决定调用其fireCallback方法,因此您将在屏幕上看到alert(“call back!”)。

答案 2 :(得分:1)

我假设您想要做类似于Java中所做的事情并创建某种仅在一个地方使用的匿名类。

这在C ++中是不可能的,就像它在Java中一样。 你可以做的类似的东西是你的'接口'(尽管它不再是那个)使用lambdas,它是在你实例化类的那一刻指定的。这不是你想要的,并不是非常惯用的C ++,但可以做到。

答案 3 :(得分:1)

严格来说,C ++中没有这样的语义。如果要将接口传递给函数,可以将指针或引用作为参数,并在单独的类中实现该接口。

您将拥有以下成员函数之一(跟随您的姓名)

myClass::setInterface(MyInterface* ptr);
//or
myClass::setInterface(MyInterface& ref);

然后执行

class MyInterfaceImpl : public MyInterface{
    //Stuff
}

然后,您可以将指针传递给MyInterfaceImplsetInterface,但是您无法在运行中定义并将其传递给功能

编辑:如果您想要接近这种行为,请考虑πάνταῥεῖ回答,或者在创建实例之前实现该类并将其传递给函数,尽管这在我的经历中非常不寻常,并用本地类定义混淆代码)