是否可以使用開關,並具有不同的子類?我想使用開關而不是幾個if語句。我有一個叫做指令和不同類型的子類的抽象類。所以我希望每個案例都是不同的子類。像:使用開關的子類?
switch (instruction){
case instruction1:
case instruction2:
case instruction3:
}
等 如說instruction1,2,3是同一類的子類。
是否可以使用開關,並具有不同的子類?我想使用開關而不是幾個if語句。我有一個叫做指令和不同類型的子類的抽象類。所以我希望每個案例都是不同的子類。像:使用開關的子類?
switch (instruction){
case instruction1:
case instruction2:
case instruction3:
}
等 如說instruction1,2,3是同一類的子類。
不,開關僅適用於數值和枚舉。 (在Java 7將會對字符串工作了。)
這聽起來像你應該有不同的子類覆蓋的方法...或可能使用枚舉(這仍然可以覆蓋methosds)。
如果這沒有幫助,請提供更多關於您想要做什麼的信息 - 理想情況下舉一個例子。
它看起來像你想要使用運行時多態性代替。
只需在對象上調用一個方法並在每個子類中以不同的方式實現它。
不,在Java中,您只能使用整數作爲開關條件(編輯和enums
,其中ordinal()
被使用)。您正在尋找的解決方案(而不是討厭if-else
與大量instanceof
運營商)是Visitor pattern。
謝謝生病檢查。 – Giannis 2011-04-14 12:23:07
擴展Jon的迴應:在Java枚舉中有對象,所以你可能能夠通過使用枚舉來實現你想要做的事情,具體取決於它是什麼。也就是說,這可能不是一個非常優雅的方法。
另一種可能性(有點破解)可能是在超類中創建一個枚舉,並在每個子類中實現一個抽象方法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;
//...
}
好的謝謝你的回答生病檢查如何工作! – Giannis 2011-04-15 08:42:56
項目IM工作的是一個模擬器。我從文本中讀取指令然後執行它們。現在每個子類都表示不同類型的指令,並且有不同的方法。抽象類沒有任何方法。現在我的方法,我想檢查我有什麼指示,然後做什麼指示說。我開始這樣做,就好像其他人一樣,我只是想知道是否有一種「更好」的方式來做到這一點。 – Giannis 2011-04-14 12:20:13
從文本中讀取指令後,將轉至數組,但不應更改。 – Giannis 2011-04-14 12:22:38
@latusaki:如果你已經創建了合適的實例,它聽起來像你應該有一個'execute()'方法或類似的東西,並在每個子類中覆蓋它。 – 2011-04-14 12:25:28