Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Java: Vererbung/Überschreibung (https://www.delphipraxis.net/137630-java-vererbung-ueberschreibung.html)

Antigo 24. Jul 2009 16:49


Java: Vererbung/Überschreibung
 
Hi,

kurze Verständnisfrage zum Thema überschreiben in Java. Habe folgende Klassenhierarchie:

Delphi-Quellcode:
class TNode {
   public T data;

   public void setData(T d) {
      data = d;
   }

}

class TDNode extends TNode {
   public Link prev;
   static int counter = 0;


   public void setData(T d) {
      super.setData(d);
      counter++;
   }
}

Meine Frage: Wieso kann ich in der TDNode Klasse in der setData Methode das setData der Oberklasse TNode aufrufen? In meinen Vorlesungsunterlagen steht:
Zitat:

- Zugriff super.name in einer Methode von Klasse C, die B als unmittelbare Oberklasse hat
- Dies ist einfach eine Abkürzung für((B) this).name!
Allerdings wird doch setData in der der Unterklasse TDNode überschrieben, sodass man auch durch einen Cast nichtmehr an die Methode aus TNode herankommt.

Hierzu hab ich folgendes Beispiel im Web gefunden:
Delphi-Quellcode:
class Ober
{ String id = "ooo";
  String WhoAreYou()
  { return "Ober";
  }
}
class Unter extends Ober
{ String id = "uuu";
  String WhoAreYou()
  { return "Unter";
  }
 
  void identify()
  { Unter u = new Unter();
    Ober o = u;
    System.out.println(o.id);
    System.out.println(u.id);
    System.out.println(o.WhoAreYou());
    System.out.println(u.WhoAreYou());
  }

Ausgabe von new Unter().identify():

   ooo
   uuu
   Unter
   Unter
Hier ists ja das gleiche Prinzip. Ich Caste in die Oberklasse und rufe die Methode auf. Es wird aber die Methode der Unterklasse aufgerufen, weil diese ja die Methode der Oberklasse überschrieben hat.

Kann mir da jemand weiterhelfen?

Khabarakh 24. Jul 2009 17:02

Re: Java: Vererbung/Überschreibung
 
Du hast vollkommen recht, der Satz in den Unterlagen ist Unsinn.
super ist also nicht nur eine Abkürzung, sondern hebelt im Gegensatz zu einem Cast die Polymorphie aus, eine virtuelle Methode kann nicht-virtuell aufgerufen werden.

Antigo 24. Jul 2009 17:41

Re: Java: Vererbung/Überschreibung
 
gut vielen dank :)

mjustin 24. Jul 2009 19:05

Re: Java: Vererbung/Überschreibung
 
Zitat:

Zitat von Antigo
Hier ists ja das gleiche Prinzip. Ich Caste in die Oberklasse und rufe die Methode auf.

Im zweiten Beispiel wird nichts in die Oberklasse gecastet. Casten wäre an den Klammern erkennbar, z.B.:

Delphi-Quellcode:
Ober o = (Ober) u;
Im Code steht aber

Delphi-Quellcode:
Ober o = u;
damit wird u einfach nur einer kompatiblen Variablen eines Vorfahrtyps zugewiesen, d.h. man kann für "o" nur auf die in der Klasse "Ober" definierten Methoden und Properties zugreifen (die aber in der konkreten Instanz überschrieben sein können).

Cheers,

Antigo 25. Jul 2009 10:48

Re: Java: Vererbung/Überschreibung
 
Da wird ja das Prinzip der Ersetzbarkeit(?) angewendet, also man Unter als Ober einsetzen, weil Unter ja ein Untertyp von Ober ist.

Wo ist denn da jetzt der Unterschied zu einem expliziten Typecast? Ich spreche in dem Beispiel doch u als Ober an. Das müsste doch äquivalent sein zu einem Aufruf (Ober)u?!

jfheins 25. Jul 2009 11:16

Re: Java: Vererbung/Überschreibung
 
Zitat:

Zitat von mjustin
Im zweiten Beispiel wird nichts in die Oberklasse gecastet.

Doch, wird es.

Zitat:

damit wird u einfach nur einer kompatiblen Variablen eines Vorfahrtyps zugewiesen,
Was auch als impliziter Cast bezeichnet wird. Implizit, weil man eben nicht die Klammern und den Typen hinschrieben muss, da beide Typen zuweisungskompatibel sind.

Just my 2 cents.

Khabarakh 25. Jul 2009 14:24

Re: Java: Vererbung/Überschreibung
 
Hätte ich auch geantwortet, in Java unterscheiden sich aber anscheinend die Termini ein wenig von seinem Bruder im Geiste ;) . Ein Cast ist dort immer explizit, das hier wäre eine Conversion:

Zitat:

Zitat von http://java.sun.com/docs/books/jls/third_edition/html/conversions.html
  • Assignment conversion (§5.2, §15.26) converts the type of an expression to the type of a specified variable.
  • ...
  • Casting conversion (§5.5) converts the type of an expression to a type explicitly specified by a cast operator (§15.16).

Nicht, dass das irgendwie relevant wäre :stupid: .

...und könnte man die Dinger in Java auch überladen, würden sie sicher wieder anders heißen.


PS: Der Trick mit dem Wohnort gefällt mir *g* .


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz