Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java继承:区分继承类的类型_Java_Inheritance - Fatal编程技术网

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();
}