这就是我认为你在说的:
public class A {
}
public class B extends A {
}
稍后在代码中:
A apple = new A();
B banana = new B();
以下是一些您可能会觉得有用的选项:
if (apple.getClass() == A.class) { // Found an A }
if (banana.getClass() == A.class) { // This is not an A, won't get here. }
if (apple instanceof A) { // This is definitely an A }
if ((apple instanceof A) && (!(apple instanceof B))) { // It's an A but not a B }
关于最后一个选项,你写如下:
当然,我可以写类似的东西
“对象实例 A && !(对象
B)的实例”,但这是一个非常
糟糕的设计,因为我需要改变
每次我添加新的代码
A 的子类。更好的选择?
多态性几乎总是在这里帮助我们。您关于每次添加子类时更改代码的观点正是您应该认识到的标准面向对象设计演变的症状。想想你试图产生的行为。您能否将其推送到课程本身,而不是将其委托给外部提供者,该提供者查看必须推断其当前正在处理的课程?
如果没有更多信息,我无法提供太多指导,但这里有一个相当简单的示例:
// Instead of this
if (apple.isClassA()) { // run class A code
} else if (apple.isClassB()) { // run class B code
// And so forth
}
修改设计,使其更像这样:
public class A {
public void executeCommand() {
// run class A code
// This method knows that it's definitely an A, not a B
}
}
public class B extends A {
public void executeCommand() {
// run class B code
// This method knows that it's a B (and, therefore, an A as well).
}
}
稍后在执行代码中,您将之前的 if 测试替换为:
apple.executeCommand();
banana.executeCommand();
诚然,这是一个几乎微不足道的面向对象设计审查,但它可能会动摇一些东西并帮助您解决子类化问题。