用C ++实现接口

时间:2012-07-12 05:12:17

标签: java c++ interface

如何在C ++中执行此操作

interface ActionListener { void actionPerformed(); }
jButton.addActionListener(
    new ActionListener(){ void actionPerformed() { do something } }
);

到目前为止,我知道这一点,

class ActionListener {
  public : 
    virtual ~ActionListener(){}
    virtual void actionPerformed() = 0;
}

在此之后,我该怎么办...任何执行此类实施的关键字也会有所帮助。

4 个答案:

答案 0 :(得分:3)

C ++实际上没有像Java中那样的匿名类。通常的做法是声明一个继承自接口类的子类。你最接近Java的匿名类实例是这样的:

class : public ActionListener {
public:
    virtual void actionPerformed() {
        // do something
    }
} listener;
thing.addActionListener( listener );

答案 1 :(得分:1)

在C ++中没有什么可做的。您可能希望在实现时使用virtual inheritance,以避免在最终使用多重继承时出现菱形继承问题:

class SomeActionListener : virtual public ActionListener{
  public : 
    virtual ~ActionListener();
    virtual void actionPerformed();
}

在C ++ 11中,您还可以使用override进行方法实现。这会在编译时检查,以防你无意中输错了方法名称或者错误地修改了cv限定符,在这种情况下你不会覆盖:

class SomeActionListener : virtual public ActionListener{
  public : 
    virtual ~ActionListener();
    virtual void actionPerformed() override;
}

答案 2 :(得分:1)

"我怎样才能用C ++做到这一点?" - 看起来您要做的是在按钮中注册回调。在C ++中,您以不同的方式执行此操作:您不需要提供任何抽象类或接口(在OO意义上)。相反,您的按钮可能会提供以下注册回调的功能:

void Button::addActionListener(std::function<void()> callback);

callback的类型是&#34;任何可以使用零参数调用的函数,函数指针或引用,并且不返回&#34;。然后你注册你的回调:

cppButton.addActionListener( [&]{ do something; } );
// lambda

答案 3 :(得分:0)

继承自ActionListener

C ++支持多重继承。 Java没有,因此必须依赖接口。