java继承:区分继承类的类型
我有一个抽象类,叫做java继承:区分继承类的类型,java,inheritance,Java,Inheritance,我有一个抽象类,叫做A,还有两个继承类:B和C。我有一个带参数的方法: myMethod (final A a) 对于实例化对象的类型,我想做不同的事情。我怎么做 一个好的替代方案是遵循另一种设计模式,但现在不允许我更改代码 谢谢。使用操作符的实例: myMethod (final A a) { if(a instanceof B) { //... } else if(a instanceof C) { //... } else { throw new Il
A
,还有两个继承类:B
和C
。我有一个带参数的方法:
myMethod (final A a)
对于实例化对象的类型,我想做不同的事情。我怎么做
一个好的替代方案是遵循另一种设计模式,但现在不允许我更改代码
谢谢。使用
操作符的实例:
myMethod (final A a) {
if(a instanceof B) {
//...
} else if(a instanceof C) {
//...
} else {
throw new IllegalArgumentException("Unknown type: " + a);
}
}
但请记住,这是一种违背所有OO原则的糟糕做法。使用instanceof
关键字。例如:
if (a instanceof B) {...}
else if (a instanceof C) {...}
else {...}
你可以像其他人建议的那样使用instanceof
操作符,如果这是一个只有你在做的小项目,那可能没问题
鉴于您声明无法重构(?)另一个糟糕的选择是添加一个返回类型的抽象方法
i、 e.在A中添加以下内容:
public abstract Type getType();
public enum Type
{
B, C;
}
然后在B和C中实现它
e、 g.在B中:
@Override
public Type getType()
{
return B;
}
最后,您可以在方法中使用此选项,该方法采用:
e、 g
注意:以上是一个我个人不会使用的糟糕的解决方案,但我相信它比使用instanceof
稍微好一些:
- 使用
instanceof
- 如果您添加了A的另一个子类,您就不必神奇地记住,在某个地方隐藏了一些错误的代码检查
instanceof
(它会跳出来打你的脸)
- 如果您添加一个子类D,此解决方案允许您(轻松地)将D类似于B或C来处理
不过这仍然很可怕,所以简而言之,如果可以的话,重构以避免这种情况。这是否是一种糟糕的做法是一个我不想进入的争论。如果C也是B的一个子类,那么必须先对C进行“如果”测试。我不确定这在你的情况下是否重要。这是基于程序的语义…你可以说相反,B是C的一个子类。真的,真的,真的。您只需按照正确的方式排列“if”,就可以根据实际的类继承正确地检测类。这就是为什么这是一个糟糕的做法之一。很容易找到很难找到的bug。-1超类不应该知道它们的子类。在您的示例中,每次出现一个新的子类时,您都必须通过向类型添加另一个值来编辑超类。我个人不同意这种说法。我会重构以避免我的解决方案和解决方案的实例,就像瘟疫一样。鉴于OP声明他不能重构,我个人更喜欢这个而不是instanceof。如果您添加另一个子类,我的解决方案会立即提醒您存在一些与类型有关的错误代码。i、 当您添加另一个子类时,很容易忘记更新使用instanceof的代码块。myMethod是类的一部分吗?不,但它应该,在这种情况下不应该有任何参数。好的,我明白了。这正是我想要建议的,以完全避免instanceof。每个子类都将重写myMethod,并以其应有的方式实现其功能。但是,如果您与特定的设计相关联,那么您接受的解决方案可能是最好的:)
public void myMethod(final A a)
{
if (a.getType() == Type.B)
doSomething();
else
doSomethingElse();
}