java继承:区分继承类的类型

时间:2013-01-17 19:59:00

标签: java inheritance

我有一个名为A的抽象类,以及两个继承的类:BC。我有一个带参数的方法:

myMethod (final A a)

并且我希望在实例化对象的类型的情况下做出不同的事情。我该怎么办?

一个好的选择是遵循另一种设计模式,但我现在不允许更改我的代码。

感谢。

3 个答案:

答案 0 :(得分:5)

使用instanceof关键字。例如:

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

答案 1 :(得分:2)

使用instanceof运算符:

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

但请记住,这是违反所有OO原则的不良做法。

答案 2 :(得分:0)

可以使用instanceof运算符,正如其他人所建议的那样,如果这是一个只有你正在处理的小项目,这可能就好了。

鉴于你声明你不能重构(?)另一个糟糕的选择将添加一个返回该类型的抽象方法。

即。将以下内容添加到A:

public abstract Type getType();

public enum Type
{
    B, C;
}

然后在B和C中实现它。

e.g。在B:

@Override
public Type getType()
{
    return B;
}

最后,您可以在采用A:

的方法中使用它

e.g。

public void myMethod(final A a)
{
    if (a.getType() == Type.B)
        doSomething();
    else
        doSomethingElse();
}

注意:上面是一个糟糕解决方案,我个人不会使用,但我认为它比使用instanceof 略好

  • 使用instanceof
  • 时,您需要注意支票的顺序
  • 如果你添加A的另一个子类,你不必神奇地记得你有一些不好的代码检查instanceof被隐藏在某个地方(它跳出来并砸到你的脸)
  • 如果添加子类D,此解决方案允许您(轻松)类似于B或C处理D

但它仍然很可怕,所以简而言之,如果可以的话,重构可以避免这种情况。