Zdravím,
 
 Problém je v tom, že fieldy nelze na rozdíl od metod přetěžovat, ale jen 
"zastínit" (shadow). Objekt třídy FooChildInner má vlastně dva odlišné fieldy 
se stejným názvem. Který z nich použije se definuje už při překladu tím, jaký 
je v daném místě deklarován (pozor, deklarován - tj. co vidí kompilátor) 
konkrétní typ - a jelikož metoda inner() vrací FooParentInner, tak se tam 
použije field FooParentInner.s
 
 Řešením je použít metodu (tj. getter).
 
 Jo a doporučuji si v IDE zapnout aby byla deklarace fieldu se jménem použitým 
v předkovi označena za chybu (nebo přinejlepším warning).
Je to jedna z věcí, které neměly být nikdy v jazyce povoleny...
 
Kamil Podlešák
 

-----Original Message-----
From: konference-boun...@java.cz [mailto:konference-boun...@java.cz]on Behalf 
Of Ladislav Kulhanek
Sent: Wednesday, August 19, 2009 3:17 PM
To: Java
Subject: Dedicnost


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