2012-07-12 113 views
1

我怎样才能做到这在C++实现在C++接口

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

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

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

这之后我该怎么办......任何关键字做这种的实施也将有所帮助。

+1

这是你想要的? http://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c – Mysticial 2012-07-12 05:14:08

+0

我读过之前,但我不知道如何做c + +中的上述java概念,即创建一个指向接口的指针并定义它的方法...我已经看到这在NetBeans的Java中实现,以简化操作代码的可读性按钮 – 2012-07-12 05:17:05

回答

3

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

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

我可以得到一个链接,指出这是什么......以及显示上述示例.. – 2012-07-12 05:24:48

+0

@JeffreyChen - 这是众所周知的名称:无名级;匿名课堂;未命名的类。这是C++的标准部分。只需谷歌这些条款,以获得大量的链接。例如,请参阅[MSDN](http://msdn.microsoft.com/zh-cn/library/a3bbz53t%28v=vs.80%29.aspx)说明。 – 2012-07-12 05:44:15

0

继承自ActionListener

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

+0

我知道这个类myClass:public ActionListener {void actionPerformed(){}};但是有没有办法不从ActionListener继承,就像在java中一样myClass不会实现actionListener,因为我可以创建一个ActionListener的对象并重新实现actionPerformed() – 2012-07-12 05:20:41

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; 
} 
1

“?我怎样才能做到这在C++” - 看起来你要做的是在一个按钮中注册一个回调。在C++中,您可以采用不同的方式来实现:您不需要提供任何抽象类或接口(按照OO意义)。相反,您的按钮可能会注册一个回调提供以下功能:

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

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

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