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

时间:2014-04-05 00:07:36

标签: java abstract-class

这是我的抽象类的标题

public abstract class RecursiveGo extends JFrame implements ActionListener

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

3 个答案:

答案 0 :(得分:3)

如果有一个有用的非静态方法依赖于类的一个子集(即不依赖于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注释,看看是否将该方法设为静态是值得的。我个人赞成依赖注入和模拟框架,所以我不喜欢移动山脉使方法静态,但当然这将是解决问题的简单方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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