簡體   English   中英

Java 中是否有辦法根據 object 的子類調用不同的子方法?

[英]Is there a way in Java to call different child method depending on which subclass is the object?

在我的項目中,我有一個超類和兩個從它擴展的子類。 超類中有一個方法在每個子類中被不同地覆蓋。 我想知道是否可以引入一種方法(在另一個類中),該方法將任一子類的 object 作為參數並調用在其中一個子類中覆蓋的方法(取決於 object 屬於哪個子類)。

public class Superclass{
    public int method(){return 0;}
}
public class Subclass1 extends Superclass{
    public int method(){return 1;}
}
public class Subclass2 extends Superclass{
    public int method(){return 2;}
}
public class CallingClass{
    public static int dependantCall(Superclass parameter){return parameter.method}

我希望能夠做類似的事情

Subclass1 subclassObject = new Subclass1;
System.out.println(CallingClass.dependantCall(subclassObject));

並得到 output

1

這就是多態性的用途。 將超類定義為參數類型將允許您傳入任一子類。

例如,在您的其他 class 中,您可以像這樣定義它:

// classes Dog and Cat extend Animal and override makeNoise()
class Owner{

  playWith(Animal a){
    a.makeNoise();
  }

}

現在 Owner 可以接受 owner.makeNoise(cat) 和 owner.makeNoise(dog)

更多閱讀: https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

是的,這是完全可能的。 該方法如下所示:

public <T extends Superclass> void foo(T subclassObject) {
...
} 

或者:

public void foo(Superclass obj) {
...
}

請注意,在上述方法中,您也可以傳遞子類的對象(它們是協變數據類型)。

這是 Java 在創建子類時默認執行的操作,因此無需做任何特別的事情。 每個 object 在運行時都攜帶其類型信息,調用的方法始終是 object 最具體的方法。 例子:

public class Doer {
  public void doSomething() {
    // Body presence
  };
}

public class Painter extends Doer {
  @Override
  public void doSomething() {
    // Paint here
  }
}

public class Manager extends Doer {
  @Override
  public void doSomething() {
    // Micromanage here
  }
}

// Elsewhere in your code: 
public void busyness(Doer doer) {
   doer.doSomething();
}

風格說明:如果可能的話,應該更喜歡使用接口而不是基類(只有當你想在子類之間共享實現時才應該使用基類)。 接口示例:

public interface Doer {
  void doSomething();
}

public class JackOfAllTrades implements Does {
  @Override
  public void doSomething() {
     // Do whatever necessary
  }
}

// Client code stays exactly the same as above: 
public void busyness(Doer doer) {
   doer.doSomething();
}

請注意,在 Java 中,class 只能有一個基礎 class,但可以實現多個接口。

@Override注釋不是嚴格要求的,但它們可以幫助 Java 編譯器為您發現一些錯誤(例如,如果您打印錯誤的方法名稱)。

在您的示例中,它看起來像

public class CallingClass {
  public static int dependantCall(Superclass parameter) {
    return parameter.method();
  }
}

Subclass1 subclassObject = new Subclass1();
System.out.println(CallingClass.dependantCall(subclassObject));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM