1

我如何在 C++ 中做到这一点

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

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

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

在此之后我该怎么做......任何关键字来做这种实现也会有所帮助。

4

4 回答 4

4

C++ 并没有像 Java 中那样真正具有匿名类。通常的事情就是声明一个继承自接口类的子类。你最接近 Java 的匿名类实例是这样的:

class : public ActionListener {
public:
    virtual void actionPerformed() {
        // do something
    }
} listener;
thing.addActionListener( listener );
于 2012-07-12T05:18:02.080 回答
1

在 C++ 中没有其他事情可做。您可能希望在实现时使用虚拟继承,以避免最终使用多重继承时出现菱形继承问题:

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;
}
于 2012-07-12T05:19:02.250 回答
1

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

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

的类型callback是“任何可以用零参数调用并且不返回任何内容的函数、函数指针或引用”。然后你像这样注册你的回调:

cppButton.addActionListener( [&]{ do something; } );
// lambda
于 2012-07-12T06:55:16.410 回答
0

继承自ActionListener

C++ 支持多重继承。Java 没有,所以它必须依赖接口。

于 2012-07-12T05:16:40.427 回答