簡體   English   中英

為什么超類實現了應該由子進程實現的接口方法?

[英]Why does a superclass implement interface methods which are supposed to be implemented by the child?

這是一個父類

public class Parent {
    public void f() {

    }
}

這是一個簡單的界面

public interface If {
    public void f();
}

這是一個兒童班

public class Child extends Parent implements If{}

我的問題是:雖然它是聲稱實現接口If Child ,但接口方法是在Parent實現的。 為什么允許這樣做?

為什么允許這樣做?

因為Child滿足合同。 Child通過實現If使得它將提供一個不接受任何參數且沒有返回值的公共f函數。 它做到了。 它是如何做到的,在這種情況下,通過從超類繼承它,是無關緊要的。 合同是滿意的,這是最重要的。

接口方法在Parent中實現

不是真的,它碰巧有f方法。 如果你做了If inst = new Parent()你會得到一個編譯錯誤,因為Parent沒有說它實現了If (沒有implements If ); 實施If不是其合同的一部分。 另一方面, Child 確實提供了合同,所以If inst = new Child()工作正常。

FWIW,你可能不會故意這樣做,盡管可以說沒有任何問題。 但是如果你想要使用的超類完全適合你想要實現的接口中的一個方法,它就會出現。

當發生這種情況時,您有三種選擇:

  1. 什么都不做,讓Parent的方法直接實現接口方法。

  2. 即使您不打算做任何不同的事情,也要覆蓋Parent的方法,例如:

     @Override public void f() { super.f(); } 

    ...除非你有想要在調用Parentf之前或之后運行的代碼,否則它實際上沒有任何成就。

  3. 覆蓋f並自己實現它,忽略Parent的版本。 但是,如果Parentf與接口方法的f 完全不同 ,那只會有意義 - 在這種情況下,你不應該首先將Parent子類化,因為如果你根據接口的行為重新實現f ,你的f將不再滿足Parent#f合同(就其行為而言),你將打破子類化的“是一個”規則。

所以,如果它有機地發生,那么選項1是完全合理的。 你可能不會故意設置它。

這是完全合法的,因為當您實現該方法時,它適用於兩者。

從課堂角度和界面角度。 單個實現既有兩個目的,也沒有任何含糊之處。

沒有辦法限制類或接口具有相同的方法簽名,除非您與它們有關系,但在這種情況下將沒有問題。

接口的要點是列出一組方法,這些方法可以在實現接口的類的任何對象上調用。

通過聲明一個類實現一個接口,您聲明可以在您的類上調用這組方法。

只要是這種情況(例如在您的示例中),就沒有問題。

暫無
暫無

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

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