text: Redefinition Methode in lokaler Klasse - ABAPforum.com
  Redefinition Methode in lokaler Klasse
  Beitrag von olli-x (Specialist / 166	/ 0 / 1 ) » 30.01.2007 14:11
  ich habe gerade ein Problem mit der Redefinition einer Methode...
  Ich habe in einem Report eine lokale Klasse "LCL_ALV".
  Diese Klasse hat einen Konstruktor, in dem versch. geschützte(protected) Methoden aufgerufen werden - u.a. SET_DATA( ).
  Von dieser Klasse habe ich eine weitere Klasse abgeleitet "LCL_ALV_DETAIL"
  Die Methode SET_DATA( ) habe ich in der Subklasse redefiniert und im Rumpf mit Super-> die Methode der Superklasse aufgerufen...
  Für die Subklasse habe ich keinen eigenen Konstruktor geschrieben, weil der Konstruktor der Superklasse alles benötigte leistet...
  Wenn ich nun mein Programm im Debugger beobachte wird bei Objekterzeugung der Subklasse der Konstruktor der Superklasse aufgerufen, darin erfolgt der Aufruf der Methode SET_DATA( ) - allerdings wird der Quellcode der Superklasse prozessiert und NICHT die Redefinition meiner Subklasse !?!?!!
  Habe ich ein Verständnisproblem - was läuft hier falsch?
  Ich würde mich freuen, wenn ich schnell Antwort bekomme - ES EILT !!!!
  Beitrag von DeathGuardian (Expert / 759	/ 0 / 2 ) » 30.01.2007 15:25
  - Du erzeugst ein Object deiner Subklasse.
  - Der Constrkctor deiner Subklasse ruft den SUPER-Construktor.
  - Und nun soll dieser SUPER-Construktor die Methode deiner Subklasse aufrufen??????
  Ich würd sagen du hast ein Verständnisproblem.
  Beitrag von olli-x (Specialist / 166	/ 0 / 1 ) » 30.01.2007 15:34
  die Subklasse hat keinen explitziten Konstruktor.
  Also wird der Konstruktor der Superklasse gezogen...
  Innerhalb des Konstruktors wird mit me->set_data( ) die entsprechende Methode aufgerufen.
  Ich hatte angenommen, das ich mich, dadurch das ich den Konstruktor nicht mit "super" aufrufe auf der "Ebene der Subklasse" befinde (wegen Vererbung) und die Redefinition gezogen wird...
  Ich lag wohl daneben was?
  Beitrag von ereglam (Top Expert / 1826	/ 0 / 5 ) » 30.01.2007 15:55
  lege mal einen Konstruktor Deiner Unterklasse an, der den Konstruktor der Superklasse (mit super->constructor() ) aufruft.
  Es liegt möglicherweise daran, dass die Instanz zu deiner Unterklasse noch nicht instanziiert wurde und daher der me->set_data() deshalb falsch gezogen wird...
  Wenn nicht, musst Du im Unterklassenkonstruktor set_data() explizit aufrufen.
  Beitrag von olli-x (Specialist / 166	/ 0 / 1 ) » 30.01.2007 16:16
  Hallo ereglam,
  genau das hatte ich gerade gemacht
  Allerdings mit einem weinenden Auge...
  Durch den Aufruf des Konstruktors mit super-> in der Superklasse, befinde ich mich auch in der Superklasse und dann hab ich das Szenario das DeathGuardian meinte...
  Dann muss ich anschließend die Methode set_data( ) erneut aufrufen, damit sie aus der Unterklasse gezogen wird... Das führt dazu, das ich versch. Methoden, die erst nach set_data( ) aufgerufen werden können im Konstruktor der Unterklasse ebenfalls erneut aufrufen muss...
  Wie sieht es denn jetzt eigentlich mit meinem Verständnis aus?
  Da ich in der Unterklasse keinen eigenen Konstruktor definiert habe, dachte ich, das über die Vererbung der Quellcode der Superklasse gezogen- und als Konstruktor der Unterklasse ausgeführt wird und somit die Methodenaufrufe im Konstruktor mit "me->...( ) "auch wirklich "in der Unterklasse" ausgeführt werden...
  Sei es, das die Methoden unverändert über Vererbung kommen oder Redefiniert wurden...
  Ist diese Annahme grundsätzlich falsch ?
  Oder klappt das bei SAP nicht? Vielleicht weil es lokale Klassen sind?
  Beitrag von Flo (Specialist / 161	/ 0 / 0 ) » 30.01.2007 17:19
  Hier hab ich noch was schönes aus der SAP Hilfe dazu:
  In Oberklassen, die keinen explizit definierten Instanz-Konstruktor haben, wird der implizit immer vorhandene Instanz-Konstruktor ausgeführt. Dieser sorgt automatisch für den Aufruf des Instanz-Konstruktors der nächsthöheren Oberklasse.
  In Konstruktoren sind die Methoden von Unterklassen nicht sichtbar. Falls ein Instanzkonstruktor eine Instanzmethode der gleichen Klasse über die implizite Selbstreferenz ME-> aufruft, wird die Methode so aufgerufen, wie sie in der Klasse des Instanzkonstruktors implementiert ist und nicht die eventuell redefinierte Methode der zu instantiierenden Unterklasse. Dies ist eine Ausnahme von der Regel, daß beim Aufruf von Instanzmethoden immer die Implementierung in der Klasse aufgerufen wird, auf deren Instanz die Referenz gerade zeigt.
  Beitrag von Olli (ForumUser / 3	/ 0 / 0 ) » 30.01.2007 17:31
  1000 Dank für den Hinweis.
  Ich bin mit der Fragestellung gar nicht auf die Idee gekommen in die Hilfe zu schauen
  Dies ist eine Ausnahme von der Regel,
  war wieder klar das ich genau passend zur Ausnahme kodiere
  Weil ich den Hals mal wieder nicht voll kriege:
  Ist das an dieser Stelle eigentlich IMMER so ( also auch bei Java, C#, ...) , oder handelt es sich hier um eine Eigenart von ABAP?
  Weiß das vielleicht jemand, ansonsten probiere ich das irgendwann mal aus...
  Nochmal vielen Dank für alle Antworten.
  Beitrag von Flo (Specialist / 161	/ 0 / 0 ) » 30.01.2007 17:32
  Nun noch ein Hinweis wie man das ganze einigermassen sauber gelöst bekommt:
  In der Superklasse legt man eine Methode Initialize( ) an die die Initialisierungen der Superklasse durchführen soll. z.B. Aufruf von set_data( ). (Die Superklasse hat keinen Constructor der zum Aufruf von set_data führt)
  In der Subklasse ruft man im Constructor den super->constructor und danach Initialize( ) (Kann man überdefinieren muss man aber nicht) Wenn man nun set_data überdefiniert hat wird die set_data der Subklasse aufgerufen.