5

我的班级实现了 ActionListener。我在下面实现了以下嵌套类:

JMenuItem mntmNew = new JMenuItem("New...");
    mntmNew.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e){
            doNew(e); //calls to outer class for cleaner code
        }
    });
    mnFile.add(mntmNew);

    JMenuItem mntmLoad = new JMenuItem("Load...");
    mntmLoad.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e){
            doLoad(e); //calls to outer class for cleaner code
        }
    });
    mnFile.add(mntmLoad);

//etc. for the rest of the menu system

但是,Eclipse 仍然告诉我,我的类必须实现继承的抽象方法 ActionListener.actionPerformed(ActionEvent e)。不能以这种方式在嵌套类中实现覆盖方法吗?

4

1 回答 1

8

你的问题:

不能以这种方式在嵌套类中实现覆盖方法吗?

答案是否定的。Eclipse(实际上是Java)抱怨说,当您将类声明为实现 ActionListener 时,您并没有actionPerformed(...)在类自己的范围内为您的类提供必要的方法——最后一部分非常重要。实现接口的类必须在自己的范围内实现接口所需的所有方法,而不是在嵌套类中。请注意,这不会阻止您嵌套也实现 ActionListener 或其他接口的类,但无论如何,规则仍然是实现接口的非抽象类必须覆盖接口的所有方法。

但是由于您没有将类的对象用作 ActionListener,因此简单的解决方案是不将您的类声明为实现 ActionListener 接口。问题解决了。实际上你最好不要让你的 GUI 类实现你的监听器接口,因为将它们组合在一个类中要求一个类做太多事情。用技术术语来说,它不必要地降低了类的内聚性,并有可能增加它的耦合性,从而降低其可读性和可维护性。

于 2013-06-15T21:38:29.003 回答