使用带子类的开关?

时间:2011-04-14 12:08:26

标签: java switch-statement

是否可以使用switch并具有不同的子类?我想使用switch而不是几个if语句。我有一个名为指令的抽象类和具有不同类型的子类。所以我希望每个案例都是一个不同的子类。喜欢:

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

等 因为所述指令1,2,3是同一类的子类。

5 个答案:

答案 0 :(得分:6)

不,切换仅适用于数值和枚举。 (在Java 7中,它也适用于字符串。)

听起来你应该在不同的子类中覆盖一个方法......或者可能使用枚举(它仍然可以覆盖方法)。

如果这没有帮助,请提供有关您尝试做的更多信息 - 最好是举例。

答案 1 :(得分:4)

看起来你想要使用运行时多态。

只需在对象上调用一个方法,并在每个子类中以不同方式实现它。

答案 2 :(得分:0)

不,在Java中,您只能使用整数作为切换条件(编辑:和使用enums的{​​{1}})。您正在寻找的解决方案(而不是令人讨厌的ordinal()包含大量if-else运算符)是Visitor pattern

答案 3 :(得分:0)

扩展Jon的响应:在Java枚举中是对象,因此可能能够通过使用枚举来实现您尝试做的事情,具体取决于它是什么。也就是说,它可能不是一个非常优雅的方法。

答案 4 :(得分: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;
//...
}