我有一个名为A
的抽象类,以及两个继承的类:B
和C
。我有一个带参数的方法:
myMethod (final A a)
并且我希望在实例化对象的类型的情况下做出不同的事情。我该怎么办?
一个好的选择是遵循另一种设计模式,但我现在不允许更改我的代码。
感谢。
答案 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
instanceof
被隐藏在某个地方(它跳出来并砸到你的脸)但它仍然很可怕,所以简而言之,如果可以的话,重构可以避免这种情况。