2013-01-17 114 views
0

我有一個叫做A的抽象類,以及兩個繼承類:BC。我有一個參數的方法:java繼承:區分繼承類的類型

myMethod (final A a) 

並且我想在實例化對象的類型的情況下做不同的事情。我該怎麼做?

一個很好的選擇是遵循另一種設計模式,但我現在不允許更改我的代碼。

謝謝。

+0

myMethod是A類的一部分嗎? –

+0

不,但它應該,並且在這種情況下不應該有任何參數。 –

+0

好吧,我明白了。這正是我想建議的,以避免instanceof。每個子類都會覆蓋myMethod並按照它應該的方式實現其功能。但是,如果你被綁定到特定的設計,那麼你接受的解決方案可能是最好的:) –

回答

5

使用instanceof關鍵字。例如:

if (a instanceof B) {...} 
else if (a instanceof C) {...} 
else {...} 
+0

這是否是一個不好的做法是我不想進入的辯論。 – ecbrodie

+0

如果C也是B的一個子類,那麼你必須首先對C進行'if'測試。但我不確定這是否會影響您的確切情況。 –

+0

這是基於程序的語義......你可以說相反,B是C的一個子類。 – ecbrodie

2

使用instanceof操作:

myMethod (final A a) { 
    if(a instanceof B) { 
    //... 
    } else if(a instanceof C) { 
    //... 
    } else { 
    throw new IllegalArgumentException("Unknown type: " + a); 
    } 
} 

但請記住,它是對所有OO原則不良做法。

0

可以使用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
  • 如果您添加A的另一個子類,您不會奇蹟般地記住您有一些錯誤的代碼檢查instanceof隱藏地方(它跳躍出來,嫌你的臉)
  • 如果你添加一個子類d,該解決方案可以讓你(容易)治療d類似,B或C

它仍然是可怕的,所以在簡而言之,如果可以的話,重構可以避免這種情況。

+0

-1超類不應該知道他們的子類。在你的例子中,每次有新的子類出現時,你都必須通過向Type添加另一個值來編輯超類。 – splungebob

+0

我個人不會這樣做。我會重構避免我的解決方案和像鼠疫這樣的instanceof解決方案。鑑於OP聲稱他不能重構,我個人比較喜歡這個例子。如果您添加了另一個子類,我的解決方案會立即向您發出警告,提示存在一些關於該類型的錯誤代碼。即當添加另一個子類時,忘記更新使用instanceof的代碼塊太容易了。 – phippsnatch