簡體   English   中英

隱藏子類中的方法

[英]Hiding methods in subclass

我有一個帶有某些已實現方法的抽象超類。

是否可以在繼承自該超類的子類中隱藏該超類的方法? 我不想從某些子類的超類中看到一些方法。 最后但並非最不重要的一點是,是否可以更改子類中與超類同名的方法的參數數量?

假設我們在超類中有一個方法public void test(int a, int b) ,但現在我想要在子類中有一個方法public void test(int a) ,該方法調用超類函數,並且超類中的方法不再可見。

是否可以在繼承自該超類的子類中隱藏該超類的方法?

如果您在超類中將方法設為私有,則該方法在子類(或其他任何子類)中將不可見。

但是,如果您需要基類中的方法是公共的,則無法將其隱藏在子類中,例如通過私有實現覆蓋它。 (您不能“降低可見性”,即在子類中從“公開”或“受保護”變為“私有”。)

最好的解決方法可能是重寫方法並拋出運行時異常,例如UnsupportedOperationException

是否可以更改子類中與超類同名的方法的參數數量?

不,您不能更改簽名。 您可以創建另一個具有相同名稱和不同數量參數的方法,但這將是一個不同的(重載)方法,並且基類中的方法仍然可見。

您無法從超類中完全隱藏方法,始終可以調用,例如

  MyBase o = new MyClass();
  o.test(1, 2);

但是,您可以通過特定方式覆蓋該方法:

class MySuper {
  public void test(int a, int b) {; }
}

class MyClass extends MySuper {
  @Deprecated
  @Override
  public void test(int a, int b) {
    throw new UnsupportedOperationException("Do not call this method, call test(int a) instead!");
  }

  public void test(int a) { ; }
}

不,您不能在子項中隱藏公共方法,例如,通過在子項中將方法設為私有。

原因是擁有子類的實例,您可能總是將其強制轉換為基類,然后在其中調用方法。

因此,這種行為是合乎邏輯的。 重新設計類層次結構,或者如果新API變得過於丑陋,則創建一個新類。

但是,您可以覆蓋該方法,

/**
 * Use <code>test(a)</code> instead.
 * @param a.
 * @param b.
 */
@Deprecated
@Override
public void test(int a, int b) {
    throw new UnsupportedOperationException("Use test(int) instead.");
}

public void test(int a) { // Overloaded method
    int b = ...;
    super.test(a, b);
}

可以重載方法:相同的名稱,不同的參數類型。

Java不支持降低可見性。

有一種方法可以執行以下操作,但是很復雜:

  1. 您需要為父類型創建一個接口。 該接口不需要方法。
  2. 您創建另一個新的Delegate類型,它實現方法public void test(int a, int b)
  3. 您刪除當前的父類型。
  4. 您將創建兩個實現接口的新類型。 一個將調用test(a,b) DelegateDelegate ,另一個則創建一個新方法test(a) ,該方法最終使用Delegate實例。

因此,實現舊代碼的類型永遠不會對外界可見(它可以是程序包私有類)。

暫無
暫無

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

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