Ahoj,

nechce se mi momentálně prohánět kód překladačem, ale AFAIK by to mělo být
takto: která konkrétní metoda se zavolá se určuje za běhu (v Javě jsou
všechny metody virtuální), takže inner() skutečně vrátí instanci třídy
FooChildInner. Ale která proměnná se přečte se určuje už při překladu, a
protože v metodě print() má návratová hodnota metody inner() statický typ
FooParentInner, přečte se FooParentInner#s.

Můžete namísto proměnné s napsat metodu String s() { return
"FooParentInner"; }, kterou v potomkovi překryjete String s() { return
"FooChildInner"; }.

LT

2009/8/19 Ladislav Kulhanek <[email protected]>

> Ahoj, narazil jsem na problem pri dedeni. Mam 2 tridy s vnitrnima tridama:
>
> // predek
> public class FooParent {
>     private FooParentInner fpi = new FooParentInner();
>
>     protected FooParentInner inner() {
>         return fpi;
>     }
>
>     public void print() {
>         System.out.println(inner().s);
>     }
>
>     protected static class FooParentInner {
>         public String s = "FooParentInner";
>     }
> }
>
> // potomek
> public class FooChild extends FooParent {
>     private FooChildInner fci = new FooChildInner();
>
>     @Override
>     protected FooChildInner inner() {
>         return fci;
>     }
>
>     protected static class FooChildInner extends FooParentInner {
>         public String s = "FooChildInner";
>     }
> }
>
> // main metoda
> public static void main(String[] args) {
>         FooChild f = new FooChild();
>         f.print();
> }
>
> Vypise se FooParentInner. Proc? Nechapu, proc se nevypise text z potomka.
> Diky za rady.
>

Odpovedet emailem