【问题标题】:Must implement the inherited abstract method必须实现继承的抽象方法
【发布时间】:2013-06-12 06:17:30
【问题描述】:

我的班级实现了 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)。不能这样在嵌套类中实现覆盖方法吗?

【问题讨论】:

  • 反对票被反对票取消。我不确定为什么有人对这个问题投了反对票,因为这对我来说似乎是一个有效的问题。
  • ++ 因为@HovercraftFullOfEels 的回答:)

标签: java swing interface nested-class actionevent


【解决方案1】:

你的问题:

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

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

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

【讨论】:

  • 经过我的研究,我得出了这个结论(GUI不应该实现监听器接口),这引入了我问的问题。有趣的是,标准的 Oracle 文档似乎没有任何关于如何在大型菜单系统上正确实现动作监听器的参考。
  • @Daniel:我认为 Oracle 文档是学习 Swing 基础知识的一个很好的起点,但仅此而已。就我自己而言,我正在努力学习创建和维护大型 Swing 应用程序的来龙去脉,并试图在 MVC、解耦和依赖注入方面保持它尽可能干净。 OOP 文章和在线视频演示很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多