title image


Smiley Re: Das kann nicht sein.
Hi.



Ähm, dein Bsp. ist nicht so ganz das was ich meinte. Ich glaube Du hast mich noch nicht richtig verstanden.

Das was Du da machst, ist ja nichts anderes als eine Variable mit einem Objekt der Superklasse zu erzeugen und dann ein Objekt der Unterklasse (A2) zuweisen.



public static A getAll() {

return new A2();

}



Hier gibts Du ja im Methodenrumpf an, dass Du ein Objekt vom Typ-A zurückliefern würdest. Gibst dann aber ein A2 zurück. Und das geht ja weil A2 von A erbt.



Hier mal mein Bspw. das ich programmiert habe.

So wie es hier steht funktionierts auch. Vielleicht haben wir etwas aneinander vorbei geredet!?





Klasse A:

public class A {



String name;

int alter;

/**

* @return Returns the alter.

*/

public int getAlter() {

return alter;

}

/**

* @param alter The alter to set.

*/

public void setAlter(int alter) {

this.alter = alter;

}

/**

* @return Returns the name.

*/

public String getName() {

return name;

}

/**

* @param name The name to set.

*/

public void setName(String name) {

this.name = name;

}



}



-------------



Klasse A2:

public class A2 extends A {



int jahr;

String ort;



/**

* @return Returns the jahr.

*/

public int getJahr() {

return jahr;

}

/**

* @param jahr The jahr to set.

*/

public void setJahr(int jahr) {

this.jahr = jahr;

}

/**

* @return Returns the ort.

*/

public String getOrt() {

return ort;

}

/**

* @param ort The ort to set.

*/

public void setOrt(String ort) {

this.ort = ort;

}



}



----------------



Klasse B:

public class B {



A eina = new A();



public A getA() {

return eina;

}



public void setA(A obj) {

this.eina = obj;

}



}



-----------------



Klasse B2:

public class B2 extends B {



public void setA2(A2 obj) {

super.setA(obj);

}



}



-----------------



Main-Klasse:

public class Main {



/**

* @param args

*/

public static void main(String[] args) {

B2 einb = new B2();

A2 eina = new A2();



eina.setAlter(12);

eina.setJahr(2000);

eina.setName("Hans-Peter");

eina.setOrt("Buxtehude");



einb.setA2(eina);



A2 neu = (A2) einb.getA();



if(neu instanceof A2) {

System.out.println("neu, ist ein A2!");

}

else {

System.out.println("neu, ist nicht ein A2!");

}



System.out.println("Attribute: ");

System.out.println("A2 Jahr: " + neu.getJahr());

System.out.println("A2 Ort: " + neu.getOrt() + "\n");



System.out.println("A Alter: " + neu.getAlter());

System.out.println("A Name: " + neu.getName());



}//main()



}





Ausgabe:



neu, ist ein A2!

Attribute:

A2 Jahr: 2000

A2 Ort: Buxtehude



A Alter: 12

A Name: Hans-Peter





Code sagt mehr als tausend Worte. ;)

Das ist zumindest was ich meinte.

Hier wird ein A2 Objekt über die Klasse B2 gespeichert und dann als ein A Objekt wieder ausgegeben.

Aber es ist dann immer noch eine Instanz von A2. Auch wenn man es casten muss. Die Inhalte (Variablen usw.) gehen nicht verloren.

Wenn ich den return-type auf A2 ändere, brauch ich natürlich nicht mehr casten, aber dann macht auch meine Vererbung keinen Sinn mehr. Ich kann den return-type nämlich gerade deswegen nicht ändern, weil ich die Superklasse (von wo ja die aufgerufene Methode ist) ja dort noch brauche und genau mit dem Return-Type. Sonst bräuchte ich nicht erben und könnte einfach die Superklasse abändern und weiter benutzen.
--------------------------------------
thrash {a} gmx {pkt} net
pgp-id: 0x71DEEF0C
Zum Posten von PHP- oder Java-Code bitte der Übersicht wegen den HTML-Tag <pre> ... </pre> und/oder <code> ... </code> verwenden!


geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: