我有一個叫做A
的抽象類,以及兩個繼承類:B
和C
。我有一個參數的方法:java繼承:區分繼承類的類型
myMethod (final A a)
並且我想在實例化對象的類型的情況下做不同的事情。我該怎麼做?
一個很好的選擇是遵循另一種設計模式,但我現在不允許更改我的代碼。
謝謝。
我有一個叫做A
的抽象類,以及兩個繼承類:B
和C
。我有一個參數的方法:java繼承:區分繼承類的類型
myMethod (final A a)
並且我想在實例化對象的類型的情況下做不同的事情。我該怎麼做?
一個很好的選擇是遵循另一種設計模式,但我現在不允許更改我的代碼。
謝謝。
使用instanceof
操作:
myMethod (final A a) {
if(a instanceof B) {
//...
} else if(a instanceof C) {
//...
} else {
throw new IllegalArgumentException("Unknown type: " + a);
}
}
但請記住,它是對所有OO原則不良做法。
您可以使用instanceof
運營商爲其他人建議,這可能是罰款,如果這是唯一的您正在使用的一個小項目。
鑑於您聲明不能重構(?)另一個可怕的選項將添加一個抽象方法來返回類型。
即添加以下爲A:
public abstract Type getType();
public enum Type
{
B, C;
}
,然後在乙實現它和C.
例如在B:
例如:
@Override
public Type getType()
{
return B;
}
最後,你可以在你的方法,需要一個使用此
public void myMethod(final A a)
{
if (a.getType() == Type.B)
doSomething();
else
doSomethingElse();
}
注:以上是壞的解決方案,我個人不會用,但我相信,這是比使用instanceof
作爲稍好:
instanceof
instanceof
隱藏地方(它跳躍出來,嫌你的臉)它仍然是可怕的,所以在簡而言之,如果可以的話,重構可以避免這種情況。
-1超類不應該知道他們的子類。在你的例子中,每次有新的子類出現時,你都必須通過向Type添加另一個值來編輯超類。 – splungebob
我個人不會這樣做。我會重構避免我的解決方案和像鼠疫這樣的instanceof解決方案。鑑於OP聲稱他不能重構,我個人比較喜歡這個例子。如果您添加了另一個子類,我的解決方案會立即向您發出警告,提示存在一些關於該類型的錯誤代碼。即當添加另一個子類時,忘記更新使用instanceof的代碼塊太容易了。 – phippsnatch
myMethod是A類的一部分嗎? –
不,但它應該,並且在這種情況下不應該有任何參數。 –
好吧,我明白了。這正是我想建議的,以避免instanceof。每個子類都會覆蓋myMethod並按照它應該的方式實現其功能。但是,如果你被綁定到特定的設計,那麼你接受的解決方案可能是最好的:) –