如何在C ++中执行此操作
interface ActionListener { void actionPerformed(); }
jButton.addActionListener(
new ActionListener(){ void actionPerformed() { do something } }
);
到目前为止,我知道这一点,
class ActionListener {
public :
virtual ~ActionListener(){}
virtual void actionPerformed() = 0;
}
在此之后,我该怎么办...任何执行此类实施的关键字也会有所帮助。
答案 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没有,因此必须依赖接口。