Vererbung / Polymorphismus - Richtige Lösung?

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von tseng (ForumUser / 8 / 1 / 0 ) »
Hallo,

ich habe eine kleine "Verständnisfrage" in Bezug auf ABAO OO und den Themen Vererbung bzw. Polymorphismus. Ich habe eine kleine Aufgabenstellung, welche in in ABAP OO lösen möchte, dabei bin ich mir jedoch noch nicht sicher wie ich das realisieren kann und ob Vererbung und Polymorphismus dafür die richtigen mittel sind.

Szenario:
Im folgenden möchte ich versuchen das Szenario Beispielhaft zu erklären um auf die eigentliche Fragestellung einzugehen.

Ich habe eine Klasse "Fahrzeug", welche grundlegende Methoden und damit Funktionalitäten implementiert. Abgeleitet von dieser Klasse würde es spezialisierte Klassen "Auto" und "Motorrad" geben, welche von der Klasse "Fahrzeug" abgeleitet und bestimmte Methoden überschrieben werden. Nun lese ich eine Menge an Daten (Eigenschaften des Fahrzeuges) aus einer Datenquelle ein, bei der ein bestimmter Wert bestimmt ob ein Datensatz ein "Auto" oder "Motorrad" ist. Abhängig von diesem Wert soll das entsprechende Objekt angelegt werden. Außerdem soll die Oberklasse als Standardklasse (Rückfallebene) genutzt werden, falls zu diesem Wert keine entsprechende Unterklasse (Spezialisierung) vorhanden ist. Hintergrund dessen ist die Anpassbarkeit, da ich davon ausgehe, dass in Zukunft noch weitere Unterklassen mit möglicherweise unterschiedlich implementierten Methoden hinzukommen wird. Ich möchte dies mit ABAP OO dementsprechend möglichst flexibel gestalten.

Fragestellung:
Die eigentliche Systematik der Vererbung ist mir soweit denke ich klar. Ich Frage mich jedoch, ob und wenn ja wie auf Basis eines bestimmten Datenwertes dynamisch entschieden werden kann ob ein Objekt von der Klasse "Fahrzeug", "Auto" oder "Motorrad" Instantiiert wird.

Ich bedanke mich schon im vorhinein für eure Hilfe!

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Zum Zeitpunkt an dem du den Befehl CREATE OBJECT ausführst, muss der Typ des Objektes bekannt sein.
Sprich, wenn du das vom Wert z.B. in einer Datenbanktabelle abhängig machen willst, musst du z.B. eine (statische) Methode anlegen die die Instanzierung aufgrund dieses Wertes vornimmt:

Code: Alles auswählen.

CASE id_class.
  WHEN 'AUTO'.
    CREATE OBJECT rr_return TYPE zcl_fahrzeug_auto.
  WHEN 'MOTORRAD'
    CREATE OBJECT rr_return TYPE zcl_fahrzeug_motorrad.
ENDCASE.
"rr_return" wäre in diesem Fall vom Typ der gemeinsamen Oberklasse "zcl_fahrzeug"

lg ADT

EDIT:
Du könntest auch natürlich den Klassennamen dynamisch angeben und so direkt in der DB ablegen:

Code: Alles auswählen.

TRY.
    CREATE OBJECT rr_return TYPE (id_class).
  CATCH cx_root.
* Irgendwas ist schief gelaufen. z.B. Die Klasse gab es nicht oder ist inkompatibel.
* Mögliche Fehler-Klassen siehe Befehl CREATE OBJECT
ENDTRY.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von tseng (ForumUser / 8 / 1 / 0 ) »
Ah oki, das scheint schon einmal eine gute Lösung. Ich war mich nicht bewusst, dass rr_return auch vom Typ der Oberklasse sein kann.

Ich habe mich inzwischen noch weiter gelesen und Methodiken gesucht um das Vorhaben umzusetzen. Dabei bin ich noch auf das Factory-Pattern gestoßen. Nach meinem Verständnis würde dies ebenso funktionieren, da die Instanzierung der Objekte dabei ebenfalls dynamisch erfolgt. Sehe ich das soweit richtig?

Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
tseng hat geschrieben:Ich habe mich inzwischen noch weiter gelesen und Methodiken gesucht um das Vorhaben umzusetzen. Dabei bin ich noch auf das Factory-Pattern gestoßen. Nach meinem Verständnis würde dies ebenso funktionieren, da die Instanzierung der Objekte dabei ebenfalls dynamisch erfolgt. Sehe ich das soweit richtig?
Mein Vorschlag ist quasi das Factory-Pattern.
Du brauchst halt eine Stelle an der die Erzeugung der Objekte passiert. Ob das jetzt eine eigene Factory-Klasse oder eine statische CREATE-Methode ist, bleibt dir überlassen.

Eine andere Variante wäre, dass die Klassen, das Auslesen der Konfiguration selbst erledigen.
z.B.: Instanziert man ein "zcl_fahrzeug_auto" liest dieses Objekt aus der Konfigurationstabelle "zfahrzeug" den Eintrag mit der ID "AUTO".

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
tseng

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von tseng (ForumUser / 8 / 1 / 0 ) »
Ah oki, dann war mein Gedankengang schon korrekt. Danke für die Hilfe, so weiß ich das ich mich auf dem richtigen Weg befinde.

Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Interessant ist dann, wie man auf die unterschiedlichen Funktionen der abgeleiteten Klassen zugreifen kann: Nämlich durch die Verwendung von Interfaces.
Eine Motorradklasse bekommt zum Beispiel das Interface ZIF_BEIWAGEN und eine Autoklasse ZIF_KOFFERRAUM.
So prüft man, ob eine Klasse ein Interface implementiert hat, um dann auf die Methoden des Interface zuzugreifen:

Code: Alles auswählen.

DATA lr_beiwagen TYPE REF TO zif_beiwagen.
TRY.
  lr_beiwagen ?= lr_fahrzeug. "lr_fahrzeug ist vom Typ AUTO oder MOTORRAD
  nutzlast = lr_beiwagen->get_nutzlast( ).
CATCH cx_sy_move_cast_error.
  exit. "Fahrzeug hat keinen Beiwagen
ENDTRY.

Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
ewx hat geschrieben:Interessant ist dann, wie man auf die unterschiedlichen Funktionen der abgeleiteten Klassen zugreifen kann: Nämlich durch die Verwendung von Interfaces.
Das wäre dann der erwähnte/gewünschte Polymorphismus ;)
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von black_adept (Top Expert / 4087 / 126 / 940 ) »
ewx hat geschrieben:Interessant ist dann, wie man auf die unterschiedlichen Funktionen der abgeleiteten Klassen zugreifen kann: Nämlich durch die Verwendung von Interfaces.
Muss aber nicht notwendigerweise durch Interfaces passieren. Gerade bei dem "Beiwagen"-Beispiel scheint mir, dass "Motorrad" wohl das einzige Fahrzeug sein wird, welches von einem Beiwagen profitiert, so dass man gerade in diesem Fall statt des Interfaces direkt auf die Motorradklasse downcasten könnte und sich hier ein damit dann überflüssiges Interface spart.
Bei dem Kofferraum wäre ich wohl d'accord mit dem Interfaceansatz.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de


Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von black_adept (Top Expert / 4087 / 126 / 940 ) »
Unglaublich was es alles so gibt.
--> Beiwagen-Interface ist ne super Idee :)
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Vererbung / Polymorphismus - Richtige Lösung?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
black_adept hat geschrieben:Unglaublich was es alles so gibt.
--> Beiwagen-Interface ist ne super Idee :)
Ganz ehrlich: Ich habe das erst hinterher herausgefunden... ;)

Seite 1 von 1

Vergleichbare Themen

2
Antw.
1824
Views
Exceptions und Vererbung
von SaskuAc » 08.11.2018 13:43 • Verfasst in ABAP® für Anfänger
7
Antw.
4471
Views
Interfaces vs. Vererbung
von ewx » 02.12.2014 18:32 • Verfasst in ABAP Objects®
0
Antw.
1369
Views
Vererbung von CL_RSR_WWW_MODIFY_TABLE
von ratoshuan » 04.04.2006 18:45 • Verfasst in Web-Dynpro, BSP + BHTML
12
Antw.
6504
Views
Textelemente und Vererbung, Ideen?
von GastX » 21.01.2015 09:17 • Verfasst in ABAP Objects®
7
Antw.
1887
Views
Vererbung abstrakte Klassen
von rob_abc » 27.09.2024 16:41 • Verfasst in ABAP Objects®

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Zeilenumbrüche ersetzen
vor einer Stunde von rob_abc 4 / 28
Dialog-Container mit Toolbar/Status
vor 20 Stunden von tar gelöst 19 / 2087
SAP Trial Version für SAP Fiori
Gestern von tar 2 / 1444

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Zeilenumbrüche ersetzen
vor einer Stunde von rob_abc 4 / 28
Dialog-Container mit Toolbar/Status
vor 20 Stunden von tar gelöst 19 / 2087
SAP Trial Version für SAP Fiori
Gestern von tar 2 / 1444

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 506
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2143
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8739