Dedicnost
Podlesak Kamil
Kamil.Podlesak na ips-ag.net
Středa Srpen 19 15:26:18 CEST 2009
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-bounces na java.cz [mailto:konference-bounces na 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.
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://amaio.cz/pipermail/konference/attachments/20090819/be30773e/attachment.htm>
Další informace o konferenci Konference