具体的には、親クラスと子クラスの両方で宣言された変数が、引数が親クラスであるメソッドに渡された子クラスのインスタンスで非表示になるのはなぜですか?
これは、私を困惑させている問題の簡単な例です。親サブタイプと子サブタイプの 3 つのクラスがあります。クラスには、フィールドとしての 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
では、アサートは失敗します。これは私が期待するものではありません。
さらに、クラスにあるのとまったく同じgetFoo
メソッドをParent
クラスに追加するとThinChild
、アサートが機能するようになりました。これは私の差し迫った問題を解決しますが、親で維持したい子クラスのそれぞれで同一のコードを維持している限り、私には望ましくないようです。
私の実際のケースはもう少し複雑ですが、関連するすべての詳細を把握できたことを願っています。私が持っていると仮定すると、なぜこれが期待される動作になるのかについての説明はありますか?
ここに示していない実際のコードには、さらに複雑な問題がある可能性があります。しかし、最初に、Java でのクラス継承に関する私の理解が正しいことを確認したいと思います。
ありがとう。