Oberklasse vs. Unterklasse Thema ist als GELÖST markiert

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

Oberklasse vs. Unterklasse

Beitrag von ralf.wenzel (Top Expert / 3552 / 167 / 243 ) »
Moin,

ich zermartere mir gerade das Hirn über folgendem Problem:

In meinem Programm habe ich eine Reihe von Objekten, die ich per Multiton Design Pattern verwalte (man könnte auch einfach sagen: Ich speichere mir die Objekte in einer internen Tabelle, deren Key die Fallunterscheidung ausdrückt LOL). Alle Objekte sind vom Typ einer Unterklasse einer gemeinsamen Oberklasse. Mein Programm erzeugt also lauter Objekte verschiedener Unterklassen, ohne selbst zu wissen, welche Art von Objekten es erzeugt (Factory Design Pattern). Weil ich ja nicht weiß, welchen Typ diese Objekte haben, deklariere ich sie als Typ der Oberklasse.

In Coding ausgedrückt:

data:
objekt type ref to zcl_oberklasse.

objekt = zcl_oberklasse=>factory( ).

In Wahrheit ist "objekt" vom Typ einer der Unterklassen von zcl_oberklasse, so dass ich eine Tabelle erhalte, die etwa folgende Struktur hat:

key objekt
1 objekt_unterklasse_1
2 objekt_unterklasse_2
3 objekt_unterklasse_1
etc.

Ich hoffe, ich habe das halbwegs verständlich ausgedrückt. Wichtig dabei ist, dass die Unterklassen eigene, zusätzliche Attribute haben, die nicht aus der Oberklasse geerbt wurden. Wenn ich aber versuche, mit objekt->attribut auf ein nicht geerbtes Attribut zuzugreifen, geht das nicht, weil me natürlich nur die Attribute der Oberklasse kennt (wegen "type ref to zcl_oberklasse").

Natürlich könnte ich die Attribute auch in der Oberklasse definieren und runtervererben, das macht aber nicht wirklich Sinn, weil der Kontext dieser Attribute sich erst in der Unterklasse erschließt. Beispiel: Wenn die Oberklasse "Auto" heißt und die Unterklassen "Cabrio" und "Kombi", macht es keinen Sinn, bereits in der Oberklasse die Farbe des Stoffverdeckes zu deklarieren.

Welchen Denkfehler mache ich?


Re: Oberklasse vs. Unterklasse

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Stichwort: Down cast

Objectunterklasse ?= Object.

Objectunterklasse->Attribut.

Re: Oberklasse vs. Unterklasse

Beitrag von ralf.wenzel (Top Expert / 3552 / 167 / 243 ) »
Moin.

Daran dachte ich auch -- dann muss ich mich aber für eine der Unterklassen entscheiden. Und genau das will ich eigentlich nicht, weil ich nicht weiß, welchen Typ das Objekt hat, das ich gerade bearbeite.

Komme ich hier mit RTTI weiter?

Re: Oberklasse vs. Unterklasse

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
ralf.wenzel hat geschrieben:Moin.

Daran dachte ich auch -- dann muss ich mich aber für eine der Unterklassen entscheiden. Und genau das will ich eigentlich nicht.....
Du musst Dich nicht fuer eine Unterklasse entscheiden, Du musst die Unterklassen unterscheiden koennen.

Re: Oberklasse vs. Unterklasse

Beitrag von ralf.wenzel (Top Expert / 3552 / 167 / 243 ) »
Unit605 hat geschrieben:
ralf.wenzel hat geschrieben:Moin.

Daran dachte ich auch -- dann muss ich mich aber für eine der Unterklassen entscheiden. Und genau das will ich eigentlich nicht.....
Du musst Dich nicht fuer eine Unterklasse entscheiden, Du musst die Unterklassen unterscheiden koennen.
Unit605 hat geschrieben:Stichwort: Down cast
Objectunterklasse ?= Object.
Objectunterklasse->Attribut.
Ich muss doch "objectunterklasse" deklarieren.... Also muss ich mich sehr wohl entscheiden.

Re: Oberklasse vs. Unterklasse

Beitrag von a-dead-trousers (Top Expert / 3618 / 125 / 942 ) »
Entweder du castest dich durch alle möglichen Unterklassen durch
ODER
du definierst in deiner Oberklasse ein Attribut, das den TYP deiner Unterklasse repräsentiert. Dann legst du noch je Unterklasse eine Konstante an und schon weist du, in was du casten musst.

Ersteres würde ich aber nicht empfehlen da du dann mit "erwarteten Exceptions" arbeiten musst und die gehen in die Laufzeit.
Zweiteres ist nicht sonderlich flexibel, da du jede neue Unterklasse berücksichtigen musst.
Irgendwie ist es wie die Entscheidung zwischen Pest und Cholera, aber merke, wenn man die Wahl hat immer die Cholera wählen. Die ist weniger tödlich ;)

lg ADT

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

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.07
Basis: 7.40

Re: Oberklasse vs. Unterklasse

Beitrag von ewx (Top Expert / 4311 / 208 / 468 ) »
Das Problem hatte ich auch gerade bzw. immer mal wieder.
Du kannst das mit Interfaces lösen.
Du kannst also z.b. in der Unterklasse CABRIO ein Interface ZIF_VERDECK implementieren und in der Unterklasse ausprogrammieren.

Dort, wo du auf die spezifischen Attribute zugreifen willst, weist du die Referenz dem Interface zu. Wenn es klappt, kannst du auf die definierten Attribute und Methoden des Interfaces zugreifen:

Code: Alles auswählen.

lr_verdeck type ref to zif_verdeck.
try.
lr_verdeck ?= ir_auto.
lr_verdeck->set_stofffarbe( 'rot' ).
catch.
endtry.
Entscheiden musst dich also, aber in dem Fall nicht für ein Unterobjekt, sondern für ein Interface, dass in verschiedenen Unterobjekten implementiert sein kann.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
ralf.wenzel


Re: Oberklasse vs. Unterklasse

Beitrag von black_adept (Top Expert / 3471 / 68 / 681 ) »
RTTI:
CL_ABAP_CLASSDESCR->ATTRIBUTES

Ansonsten:
Spendiere der Oberklasse eine Methode "GET_ATTRIBUTE", der du den Attributnamen mitgibst und der dir dann den Attributwert zurückgibt bzw. ein Raise macht, wenn das Attribut nicht vorhanden ist.

Oder ganz gemein: Schau dir das folgende Coding an

Code: Alles auswählen.

REPORT.
*----------------------------------------------------------------------*
*       CLASS lcl_test DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_test DEFINITION.
  PUBLIC SECTION.
    CLASS-DATA:  oberklasse TYPE char1 VALUE 'O'..
ENDCLASS.                    "lcl_test DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_test2 DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_test2 DEFINITION INHERITING FROM lcl_test.
  PUBLIC SECTION.
    CLASS-DATA:  unterklasse TYPE char1 VALUE 'U'.
ENDCLASS.                    "lcl_test2 DEFINITION




DATA: lo_lcl TYPE REF TO lcl_test.
FIELD-SYMBOLS: <ls_attribute> TYPE ANY.

END-OF-SELECTION.
  CREATE OBJECT lo_lcl TYPE lcl_test2.

  WRITE:/ lcl_test=>oberklasse,
          lcl_test2=>unterklasse.
*  assign lo_lcl->unterklasse to <ls_attribute>.       " Geht nicht, da zur Designzeit nicht bekannt ist, ob vom Typ der Unterklasse
  ASSIGN ('LO_LCL->UNTERKLASSE') TO <ls_attribute>.    " Geht jetzt, da zur Laufzeit der Typ (Unterklasse) bekannt ist.
  IF sy-subrc = 0.  " Klasse hatte das Attribut --> Feldsymbol wurde sauber zugewiesen
    WRITE:/ <ls_attribute>.
  ENDIF.
P.S.: CL_ABAP_CLASSDESCR hat auch eine statische Methode um dir den echten Klassennamen zurückzugeben ( also den der Unterklasse )

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ralf.wenzel

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Aktuelle Forenbeiträge

Parallele Aufrufe verhindern?
vor 14 Stunden von Garfield 5 / 1419
diverse Fragen zu ABAP
vor 2 Tagen von Kudert777 5 / 102

Vergleichbare Themen

Vererbung - Ungewollte Referenz auf Oberklasse
von der_neuling » 22.02.2021 12:12
In Superklasse auf Methode der Unterklasse zugreifen?
von Gast » 20.10.2005 12:23
Redefinition von Methoden in einer Unterklasse
von Dolph » 23.11.2005 14:12