CASTING von Objekten

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

CASTING von Objekten

Postby Ines3642 » Wed Jun 29, 2011 4:43 pm

Hallo zusammen,

ich versuche mich gerade am Casting von Objekten. Grundsätzlich ist mir klar, was damit gemeint ist und auch, wie es funktionieren sollte. Es ergeben sich dabei jedoch zwei Probleme:

1.) Die Definitionen von "UP-CASTING" und "DOWN-CASTING" vermischen sich je nach Quelle mit "implizitem Casting" und "explizitem Casting" sowie "widening cast" und "narrowing cast".

Interessanterweise bezeichnet die Quelle einen UP-Cast als widening cast, die andere als narrowing cast. Man führe diesen Satz mit allen denkbaren Permuationen fort...

Was entspricht denn nun was und was genau ist was???

2.) Natürlich will ich mir jeweils ein Beispiel basteln und testen! Dazu habe ich mir eine Klasse AUTO angelegt. Diese vererbt an die Klassen TAXI und BUS.

- eine Methode der Klasse AUTO heißt FAHREN()
- in der Klasse TAXI habe ich FAHREN() redefiniert, BUS verwendet die geerbte Methode
- in der Klasse TAXI habe ich zudem eine Methode UHR_STARTEN() implementiert (und nur hier)

Nun erzeuge ich jeweils ein Objekt, also: lo_auto, lo_taxi und lo_bus

2.a) Der Cast lo_auto ?= lo_taxi funktioniert. Ich kann anschließend sogar mit Überlisten des Syntaxcheckers die Methode UHR_STARTEN() für lo_auto aufrufen (CALL METHOD lo_auto->('UHR_STARTEN')). Ist dies ein UP- oder DOWN-CAST?

2.b) Der Cast lo_taxi ?= lo_auto führt zu einem Dump mit der Fehlermeldung "Bei der 'CAST' Operation ('?=' oder 'MOVE ?TO') wurde versucht eine Referenz einer Referenzvariablen zuzuweisen.". Warum? Ist dies ein UP- oder ein DOWN-CAST?

Wenn die Fehlermeldung korrekt ist und durch ein Mißverständnis meinerseits hervorgerufen wird: wie gelingt es mir, die Implementierung der Methode FAHREN() aus der Klasse AUTO für das Objekt lo_taxi aufzurufen?

Vielen Dank für euren Input!
Ines3642
...
...
 
Posts: 268
Joined: Tue Jan 27, 2009 5:49 pm

Re: CASTING von Objekten

Postby Ines3642 » Thu Jun 30, 2011 4:46 pm

Keine OO-Spezialisten unterwegs hier? :|
Ines3642
...
...
 
Posts: 268
Joined: Tue Jan 27, 2009 5:49 pm

Re: CASTING von Objekten

Postby Fiona462 » Thu Jun 30, 2011 6:35 pm

2.b) Der Cast lo_taxi ?= lo_auto führt zu einem Dump mit der Fehlermeldung "Bei der 'CAST' Operation ('?=' oder 'MOVE ?TO') wurde versucht eine Referenz einer Referenzvariablen zuzuweisen.". Warum? Ist dies ein UP- oder ein DOWN-CAST?


Ich habe zwar NULL Ahnung, aber ist es nicht so, dass LO_AUTO auch eine Referenz zu einem LO_BUS sein kann und deshalb nicht in LO_TAXI gecastet werden kann???

Schlag mich nicht, wenn ich vollkommen daneben liege :wink:
Fiona462
...
...
 
Posts: 149
Joined: Tue Dec 07, 2010 11:28 pm

Re: CASTING von Objekten

Postby Ines3642 » Fri Jul 01, 2011 9:14 am

In der Tat, ein Auto kann auch ein Bus sein - aus diesem Grund funktioniert 2a) :)

2b) ist an sich auch nicht zwingend ein "sinnvolles" Beispiel. Rein technisch sollte es aber meiner Meinung nach möglich sein. Daher auch ergänzend mein letzter Abschnitt. Ich könnte theoretisch in erbenden Methoden die Methoden der SUPER-Klasse kapseln (Zugriff mit SUPER->), um diese auch weiterhin im Zugriff zu haben, wenn sie redefiniert werden... allerdings würde ich genau dies gerne vermeiden und durch einen CAST Zugriff auf die "ursprünglichen" Methodenimplementierungen erreichen. ;)
Ines3642
...
...
 
Posts: 268
Joined: Tue Jan 27, 2009 5:49 pm

Re: CASTING von Objekten

Postby Helga5133 » Fri Jul 01, 2011 9:27 am

Hi,

das was du unter 2a machst ist ein UP-Cast. Du weißt die Referenz einer Unterklasse einer Oberklasse zu, also nach oben = UP. Die Syntax hierfür sollte aber eigentlich lo_auto = lo_taxi sein. Kein Fragezeichen.
Fragezeichen ist bei DOWN-Cast.

2b ist somit der DOWN-Cast.
Was für eine Referenz hast du denn beim Casting in lo_auto? Der DOWN-Cast funktioniert nur dann, wenn lo_auto auch eine Referenz auf lo_taxi enthält.

Evtl. hilft ein kleines Anwendungsbeispiel:
Du hast eine Klasse xyz, mit der du deine Fahrzeuge verwaltest. Dafür hat sie eine itab mit Referenz auf deine Oberklasse AUTO. In der itab kannst du nun sowohl Referenzen auf BUS und auf TAXI aufnehmen.
Willst du nun z.b. alle Fahrzeuge ausgeben loopst du über die itab, weißt ja aber nicht, ob du konkret eine Referenz auf einen BUS oder ein TAXI hast. Daher machst du dann einen DOWN-Cast z.B. auf lo_taxi. (Fehler abfangen! Könnte ja auch ein BUS sein, dann gibt's Laufzeitfehler)
Geht das Casting gut, hast du in lo_taxi eine Referenz auf TAXI und kannst die Methoden der Klasse aufrufen.

Gruß
Volker
Helga5133
..
..
 
Posts: 72
Joined: Wed Nov 25, 2009 5:29 pm

Re: CASTING von Objekten

Postby Ines3642 » Fri Jul 01, 2011 9:47 am

Hallo Volker,

vielen Dank für Deine Antwort!

Deine Definitionen von UP- und DOWN-Cast entsprechen auch meinem ursprünglichen Verständnis - ich finde die imaginäre Stütze der Klassenhierarchie hierbei recht hilfreich.

Allerdings verstehe ich, glaube ich, den DOWN-Cast nicht... welchen Sinn macht es, einem Taxi ein Taxi zuzuordnen? (da Du ja sagst, dass lo_auto eine Referenz auf Taxi sein muss)
Ines3642
...
...
 
Posts: 268
Joined: Tue Jan 27, 2009 5:49 pm

Re: CASTING von Objekten

Postby Helga5133 » Fri Jul 01, 2011 10:12 am

lo_auto muss nicht auf TAXI referenziert sein, sondern eine Referenz auf ein Taxi, also quasi ein Taxi-Objekt enthalten.

lo_auto selbst ist natürlich auf die Klasse AUTO referenziert, kann aber auch Zeiger auf Objekte von TAXI oder BUS oder natürlich von AUTO selbst aufnehmen, da lo_auto ja auf die Oberklasse referenziert ist.

Um jetzt dann z.B. die Methoden von Taxi aufrufen zu können, brauchst du den DOWN-Cast auf lo_taxi, da dieses ja auf die Klasse TAXI referenziert ist.
lo_auto kennt die speziellen Mehtoden von TAXI ja nicht, da dieses auf die Klasse AUTO referenziert ist.

Jetzt besser, oder reden wir hier aneinander vorbei? :D

Gruß
Volker
Helga5133
..
..
 
Posts: 72
Joined: Wed Nov 25, 2009 5:29 pm

Re: CASTING von Objekten

Postby Ilja583 » Fri Jul 01, 2011 10:22 am

Hallo panthor,

ein schönes Beispiel für den Downcast sind die RTTI-Klassen im SAP.

Wenn du Informationen über eine Variable/Objekt holen magst, kannst du i.a. die Methode cl_abap_typedescr=>describe_by_data verwenden. Der Kernel liefert dir dann eine gute Beschreibung der zu untersuchenden Variablen und zwar typspezifisch. Wenn du eine Struktur übergeben hast, bekommst du genaugenommen die Klasse cl_abap_structdescr zurück, wenn es eine Tabelle war die Klasse cl_abap_tabledescr usw.
Aber alle Rückgabeklassen sind Unterklassen von cl_abap_typedescr.

Wenn du nun im Programm eine Tabelle übergibst, weißt du dass der Rückgabewert vom Type cl_abap_tabledescr sein wird - aber da der Rückgabeparameter der Methode vom typ cl_abap_typedescr ist, musst du hier den Downcast verwenden, um an die für Tabellen erweiterte Funktionalität der cl_abap_tabledescr zu kommen.
Ilja583
.....
.....
 
Posts: 1372
Joined: Wed Jan 08, 2003 3:00 pm

Re: CASTING von Objekten

Postby Ines3642 » Fri Jul 01, 2011 11:28 am

@Volker: ja, ich glaube, wir reden aneinander vorbei. 8)

Der DOWN-Cast funktioniert ja soweit und der Sinn ist mir auch klar. Ich hänge nur am UP-Cast...

- die Klasse TAXI redefiniert die Funktion fahren()
- ich will nun aber trotzdem die "ursprüngliche" Implementierung (also die, die eigentlich von AUTO geerbt wird) nutzen

--> ich dachte, das würde durch einen UP-Cast möglich (?)

@Stefan: die RTTI-Klassen sind praktisch, in der Tat - danke für den Hinweis! :)
Ines3642
...
...
 
Posts: 268
Joined: Tue Jan 27, 2009 5:49 pm

Re: CASTING von Objekten

Postby Helga5133 » Fri Jul 01, 2011 12:56 pm

Ist ja immerhin schon Freitag, da ist alles nicht mehr so leicht :D

Ich hoffe ich verstehe es jetzt richtig:
Du willst also lo_auto = lo_taxi (also UP-Cast) machen und dann mit lo_auto die
"originale" Methode FAHREN() von Klasse AUTO aufrufen?

Richtig?

Falls ja geht das aber nicht. Stichwort Polymorphie. lo_auto enthält ja eine Referenz auf ein Objekt der Klasse TAXI und dort gibt es ja die redefinierte Methode. Daher wird auch zwangsläufig diese verwendet. Nur wenn du die Methode dort nicht redefiniert hättest, würde die Methode von AUTO gerufen werden, da sie ja in jedem Fall vererbt wurde.

Das ist zumindest mein Kenntnissstand. Bin aber auch kein OO-Profi. Evtl. hat jemand anders noch Tipps parat.

Sollte wir immer noch aneinander vorbei reden, wäre vielleicht es Code ganz gut zum Verständnis.

Gruß
Volker
Helga5133
..
..
 
Posts: 72
Joined: Wed Nov 25, 2009 5:29 pm

Next

Return to ABAP Objects®

Who is online

Users browsing this forum: No registered users and 10 guests