Klassen Polymorphie:2 Attribute gleichen Namens in einem Objekt

Loki

Aktives Mitglied
Ich hoffe, ich blamiere mich jetzt mal nicht allzu sehr.
Erst neulich ist mir folgendes Verhalten bewusst gewurden, wofür ich gern eine Erklärung bzw. Workaround hätte.

Ich habe einen Interpreter geschrieben, der seine 3 Typen von einer Klasse(Basis) erbt. Weil Java statisch Typen prüft, musste ich immer casten bei Funktionsrückgaben, da das Basisobjekt verwendet wurde, der Code wurde letztendlich ziemlich wild und häßlich. Das habe ich dann umgegangen indem ich dem Basisobjekt das gleichnamige Attribut value hinzugefügt hatte. Nun musste nicht mehr ganz so oft gecastet werden.

Nun zeigt meine IDE(Eclipse) interessanterweise 2 Attribute an für meine Kindobjekte. Eins von der Basis und ihr eigenes(Ein Begriff zum googlen hätte ich gern, um mich einzulesen). Mir ist mehr oder weniger nicht exakt klar, warum das so ist. Wieso überschreiben die Kindobjekte das Attribut nicht? Das eine Attribut stammt von der Basis das andere vom Kind. Der akt. Typ ist vom Kind, deklariert ist klarerweise als Basistyp. Sie leben getrennt nebeneinander und der eine ist via super vom Kind aus zu erreichen.
 
Zuletzt bearbeitet:
siehe Vererbungs-Kapitel in Lehrbüchern
hier
Galileo Computing :: Java ist auch eine Insel - 5 Eigene Klassen schreiben
5.11.5 Eine letzte Spielerei mit Javas dynamischer Bindung und überschatteten Attributen

wohl relativ knapp geraden,
der entscheidende Satz ist:
"Wir erkennen hier eine sehr wichtige Eigenschaft von Java, nämlich dass Variablen nicht dynamisch gebunden werden."

das Suchen zur Laufzeit fällt weg, Attribute kann der Compiler schon direkt auf die richtige Klasse zurückführen,
wobei super-Aufruf auch bei Methoden geht, die anderen Zugriffe abhängig vom Typ einer Variablen sind interessanter,
siehe Beispiel im Link


umgehen kann man diese Besonderheit, indem man nach außen und super() einfach ohne Attribute arbeitet, nur mit Methoden,
dass die IDE zwei Attribute anzeigt, was ich nicht ganz nachvollziehen kann, Screenshot?, läßt sich dabei vielleicht nicht vermeiden, oder mit private
 
Auf die schnelle und ungetestet.

Java:
public class Type {public float value;}

public class Type1 extends Type {
  public float value;
  
  Type1(String s) {
     super.value = this.value = value;
  }
}

public class Type2 extends Type {
  public String value; 

  Type2(String s) {
    this.value = value;
  }

}

Java:
Type test() {
  return new Type2();
}

Type b = test();
if(b instanceof Type1) {
  b.value *= -1; //verändert Type und nicht Type1
} else {
  //irgendwas
}

f9fmew3p.jpg
 
Zuletzt bearbeitet:
Type b = test();
if(b instanceof Type1) {
b.value *= -1; //verändert Type und nicht Type1
Die Variable b ist ja auch als Type und nichts als Type1 deklariert.

Evtl. hilft es ja, wenn Du beschreibst was Du konkret vorhast. Könnte man sich das Casten nicht den Einsatz Generics sparen. Evtl. ist aber auch einfach falsch, dass die Klassen von einander erben.
 
@Michael...
der Sinn/ die Frage ist doch ziemlich klar, warum wird nicht value aus Type1 verwendet?

> Die Variable b ist ja auch als Type und nichts als Type1 deklariert.
verlangt eben noch weitere Erläuterungen, Unterschied zur Vererbung von Methoden usw.

> Evtl. hilft es ja, wenn Du beschreibst was Du konkret vorhast.
bei Verständnis einer Idee/ Technik ist der Einsatz eher irrelevant,
durch Workaround die aktuelle Not abzuhelfen und die Frage offen zu lassen ist wohl nicht das Ziel,
letztlich muss es anders gelöst werden, das ist klar, aber nur nach Verständnis

------

siehe auch mein Posting von 10:44 falls bisher übersehen
 
> Die Variable b ist ja auch als Type und nichts als Type1 deklariert.
verlangt eben noch weitere Erläuterungen, Unterschied zur Vererbung von Methoden usw.
Die Erläuterung wäre an einer Variablen eines bestimmten Typs, kann man auf die in der Klasse definierten Methoden und Member zugreifen.
> Evtl. hilft es ja, wenn Du beschreibst was Du konkret vorhast.
bei Verständnis einer Idee/ Technik ist der Einsatz eher irrelevant,
OK, das hätte ich vielleicht besser "Evtl. hilft es mir..." formulieren sollen ;-) Mir fehlt nämlich das Verständnis für die Idee
 

Zurück
Oben