这是我的抽象类的标题
public abstract class RecursiveGo extends JFrame implements ActionListener
我想从这个类中获取一个非静态的方法,并在该类的驱动程序的main方法中调用它。我还没有制作驱动程序,但我知道如果我将这个类扩展到驱动程序并使驱动程序成为子类,它将会出现错误,因为我不会覆盖actionlistener。如何在非抽象驱动程序中从此抽象类中调用非静态方法?
答案 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(如果存在)。