繁体   English   中英

如何从另一个类调用非静态抽象方法

[英]How to call a non static abstract method from another class

这是我的抽象类的头

public abstract class RecursiveGo extends JFrame implements ActionListener

我想从此类中获取一个非静态的方法,并在此类驱动程序的main方法中调用它。 我还没有制作驱动程序,但是我知道,如果将此类扩展到驱动程序中并使其成为子类,则会出现错误,因为我不会覆盖actionlistener。 如何在非抽象驱动程序中从此抽象类调用非静态方法?

如果有一个有用的非静态方法依赖于该类的一个子集(即不依赖于ActionListener),但是整个类都必须保持抽象,那听起来好像有一条清晰的分隔线。 重构类以提取子集,并将其提供给驱动程序。

public abstract class RecursiveGo extends JFrame implements ActionListener {

  private final UsefulSubset usefulSubset;

  public RecursiveGo() {
    usefulSubset = new UsefulSubset();
  }

  // Static, so you can address it as RecursiveGo.UsefulSubset.
  // Maybe it extends JFrame, too, and if made a top-level class
  // then RecursiveGo could further subclass the subset.
  public static class UsefulSubset {
    void methodCall {}
  }
}

class YourDriver {
  public static void main(String[] args) {
    RecursiveGo.UsefulSubset instance = new RecursiveGo.UsefulSubset();
    instance.methodCall();
  }
}

当然,也许有用的子集可以自己作为顶级类,这会更好。 该代码是可延展的,并且如果未按照您希望的方式进行调整,请随时更改其形状。

正如ajb在评论中指出的那样,看看将方法设为静态是否值得。 我个人更喜欢依赖注入和模拟框架,因此我不喜欢动mountains以求将方法静态化,但是,那当然是解决问题的简单方法。

由于我们无法实例化抽象类的实例,因此在其驱动程序内创建RecursiveGo实例,该实例应为其驱动程序(子类)的实例。 然后调用创建对象的非静态方法,看看是否可以解决您的问题。

从技术上讲,您无法在Java中完成您要问的事情。 由于实现接口的类必须在该接口中定义方法,因此您必须定义该方法,或者想出另一种方法来完全执行您想做的事情。 例如,您可以尝试使RecursiveGo不实现ActionListener,然后扩展RecursiveGo,然后仍然具有ActionListener-您将使用提供的默认ActionListener(如果存在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM