[英]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不支持降低可見性。
有一種方法可以執行以下操作,但是很復雜:
Delegate
類型,它實現方法public void test(int a, int b)
test(a,b)
Delegate
給Delegate
,另一個則創建一個新方法test(a)
,該方法最終使用Delegate
實例。 因此,實現舊代碼的類型永遠不會對外界可見(它可以是程序包私有類)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.