【发布时间】:2023-03-28 04:05:01
【问题描述】:
具体来说,为什么在父类和子类中声明的变量在传递给参数为父类的方法的子类实例中是不可见的?
这是一个令我困惑的问题的简化示例。有三个类,一个父子类型和两个子子类型。这些类有一个 Foo 对象作为字段和这种静态类型的工厂方法:
class Parent {
public Foo myFoo;
public static ThinChild createThinChild(Foo someFoo) {
ThinChild thinChild = new ThinChild(someFoo);
return thinChild;
}
public Foo getFoo() {
return myFoo;
}
}
class ThinChild extends Parent {
public Foo myFoo;
public ThinChild(Foo someFoo) {
myFoo = someFoo;
}
}
class ThickChild extends Parent {
public Foo myFoo;
public ThickChild(Foo someFoo) {
myFoo = someFoo;
}
}
现在考虑这个处理程序类:
class ChildHandler {
private void doSomethingToThinChild(ThinChild thinChild) {
assert(thinChild.getFoo() != null);
doSomethingToAllChildren(thinChild);
}
private void doSomethingToAllChildren(Parent thinOrThickChild) {
assert(thinOrThickChild.getFoo() != null);
}
}
当我调用doSomethingToThinChild 时,断言通过了。但是在doSomethingToAllChildren 方法中,断言失败。这不是我所期望的。
此外,如果我将与 Parent 类中相同的 getFoo 方法添加到我的 ThinChild 类中,则断言现在可以工作。这解决了我眼前的问题,但对我来说似乎不受欢迎,因为我现在在每个子类中维护相同的代码,而我更愿意在父类中维护它。
我的实际情况有点复杂,但我希望我已经掌握了所有相关的细节。假设我有,是否有任何解释为什么这是预期的行为?
在我的实际代码中可能还有一个我没有在这里表示的复杂情况。但首先我想确认一下我对 Java 中类继承的理解是正确的。
谢谢。
【问题讨论】:
-
你的意思是
class ThinChild extends Parent? -
你不需要在嵌套类中声明
public Foo myFoo;。 myFoo 已经存在了 -
这三个类完全不相关。没有类扩展任何其他类。并且处理程序没有编译。
-
删除嵌套类中的
public Foo myFoo;。该字段从父类扩展 -
@klenwell:讨论无法编译的代码的行为没有任何意义。发布一个 SSCCE,我们将解释它的行为方式。我唯一能说的是你的处理程序的两个断言做同样的事情。
标签: java inheritance