【问题标题】:How to call a non static abstract method from another class如何从另一个类调用非静态抽象方法
【发布时间】:2014-04-05 00:07:35
【问题描述】:

这是我的抽象类的标题

public abstract class RecursiveGo extends JFrame implements ActionListener

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

【问题讨论】:

    标签: java abstract-class


    【解决方案1】:

    如果有一个有用的非静态方法依赖于类的子集(即不依赖于 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 在 cmets 中指出的那样,看看将方法设为静态是否值得。就我个人而言,我更喜欢依赖注入和模拟框架,所以我不喜欢搬山让方法成为静态的,但这当然是解决你问题的简单方法。

    【讨论】:

    • 或者他所说的调用的“非静态方法”没有引用任何实例字段,实际上可能是静态的。
    • @ajb 非常正确,但鉴于 OP 明确表示“非静态”,我该反驳谁?
    • 等等,类声明如何:public static class UsefulSubset { 出现在 RecursiveGo 类中?
    • 风格问题;你当然可以把分解出来的类放在而不是inside你的RecursiveGo。如果另一个类中的一个类是static,则它被称为“静态嵌套类”并且仅用于组织。如果不是,那么它被称为“内部类”,并且恰好属于外部类的一个实例。静态嵌套类可以设为私有,并且非常适合隐藏实现细节。 Find out more here.
    • @user3224584 我认为这些问题超出了您原始问题的范围,而是与语法有关。无论如何,我认为有用的答案不适合这个 cmets 领域。我鼓励您使用 Code Review 板或 Java 聊天室为您的实现提供进一步的具体帮助。
    【解决方案2】:

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

    【讨论】:

    • 通过创建实例我想你的意思是这样做:RecursiveGo g = new RecursiveGo();当我这样做时,我得到一个错误,因为它说你不能实例化一个抽象类。
    • 你是在 RecursiveGo 的子类中创建这个实例吗?
    • 我无法将驱动程序设为子类,因为我无法覆盖 actionlistener 方法(这意味着子类也必须是抽象的)。因此,我无法创建该类的实例(除非您知道如何在保持其功能的同时覆盖 actionlistener)。如果你想让我的驱动程序成为子类,我需要弄清楚如何在抽象类的主方法中调用非静态方法。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      相关资源
      最近更新 更多