2011-04-14 39 views
0

是否可以使用開關,並具有不同的子類?我想使用開關而不是幾個if語句。我有一個叫做指令和不同類型的子類的抽象類。所以我希望每個案例都是不同的子類。像:使用開關的子類?

switch (instruction){ 
    case instruction1: 
    case instruction2: 
    case instruction3: 
} 

等 如說instruction1,2,3是同一類的子類。

回答

5

不,開關僅適用於數值和枚舉。 (在Java 7將會對字符串工作了。)

這聽起來像你應該有不同的子類覆蓋的方法...或可能使用枚舉(這仍然可以覆蓋methosds)。

如果這沒有幫助,請提供更多關於您想要做什麼的信息 - 理想情況下舉一個例子。

+0

項目IM工作的是一個模擬器。我從文本中讀取指令然後執行它們。現在每個子類都表示不同類型的指令,並且有不同的方法。抽象類沒有任何方法。現在我的方法,我想檢查我有什麼指示,然後做什麼指示說。我開始這樣做,就好像其他人一樣,我只是想知道是否有一種「更好」的方式來做到這一點。 – Giannis 2011-04-14 12:20:13

+0

從文本中讀取指令後,將轉至數組,但不應更改。 – Giannis 2011-04-14 12:22:38

+2

@latusaki:如果你已經創建了合適的實例,它聽起來像你應該有一個'execute()'方法或類似的東西,並在每個子類中覆蓋它。 – 2011-04-14 12:25:28

4

它看起來像你想要使用運行時多態性代替。

只需在對象上調用一個方法並在每個子類中以不同的方式實現它。

0

不,在Java中,您只能使用整數作爲開關條件(編輯enums,其中ordinal()被使用)。您正在尋找的解決方案(而不是討厭if-else與大量instanceof運營商)是Visitor pattern

+0

謝謝生病檢查。 – Giannis 2011-04-14 12:23:07

0

擴展Jon的迴應:在Java枚舉中有對象,所以你可能能夠通過使用枚舉來實現你想要做的事情,具體取決於它是什麼。也就是說,這可能不是一個非常優雅的方法。

0

另一種可能性(有點破解)可能是在超類中創建一個枚舉,並在每個子類中實現一個抽象方法getEnum()。然後子類會爲枚舉返回一個不同的實例。如:

abstract class Super 
{ 
enum Type {ONE, TWO, THREE}; 

abstract Type getType(); 
} 

public class ChildOne extends Super 
{ 
public Type getType() 
{ 
return Type.ONE; 
} 
} 

public class ChildTwo extends Super 
{ 
public Type getType() 
{ 
return Type.TWO; 
} 
} 

然後,你可以這樣做:

Super someClass; 
switch(someClass.getType()) 
{ 
case ONE: 
//domSomething 
break; 

case TWO: 
//domSomeOtherThin 
break; 
//... 
} 
+0

好的謝謝你的回答生病檢查如何工作! – Giannis 2011-04-15 08:42:56