簡體   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