Zugriff auf Felder aus Unterklasse via Friends

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

Zugriff auf Felder aus Unterklasse via Friends

Postby Johann3737 » Wed Feb 20, 2013 8:30 am

Hallo zusammen,

ich habe aktuell ein OO Problem.
Eine Superklasse soll dynamisch auf die Attribute (und auch Methoden) der Unterklassen zugreifen. Instanziiert wird natürlich die Unterklasse. Bisher habe ich das gelöst, in dem die Attribute der Unterklasse alle "Public" waren. Nun wollte ich dieses umgehen, indem ich die Unterklasse als "Friend" der Oberklasse angebe und die Attribute nur noch als "Protected" oder "Private" deklariere. Der Zugriff klappt so aber nicht.

Anbei zwei abstrakte Beispiele, wie sie aber genau so auf unserem System vorhanden sind:

Beispiel In Ordnung:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. Klasse_A
  2. Attribut VAR_A_1 TYPE Protected
  3. Methode METH_A_1 TYPE Public
  4.  
  5. Klasse_B erbt von A
  6. Attribut VAR_B_1 TYPE Public
  7.  
  8. Klasse_C erbt von B
  9. Attribut VAR_C_1 TYPE Public
  10.  
  11. Quelltext Programm:
  12.  
  13. Lc_Klasse TYPE REF TO Klasse_B
  14. CREAT OBJECT Lc_Klasse TYPE Klasse_C
  15. Lc_Klasse->METH_A_1( ).
  16.  
  17. Quelltext METH_A_1:
  18. field-symbols: <fs> TYPE ANY.
  19. ASSIGN (‘VAR_B_1’) TO <fs>.
  20.  
  21. Ergebnis:
  22. Sy-subrc = 0
  23. <fs> is assigned
GeSHi ©


Beispiel Problem

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. Klasse_A (Friends: Klasse B und Klasse C)
  2. Attribut VAR_A_1 TYPE Protected
  3. Methode METH_A_1 TYPE Public
  4.  
  5. Klasse_B erbt von A (Friends: Klasse B)
  6. Attribut VAR_B_1 TYPE Protected
  7.  
  8. Klasse_C erbt von B
  9. Attribut VAR_C_1 TYPE Protected
  10.  
  11. Quelltext Programm:
  12.  
  13. Lc_Klasse TYPE REF TO Klasse_B
  14. CREAT OBJECT Lc_Klasse TYPE Klasse_C
  15. Lc_Klasse->METH_A_1( ).
  16.  
  17. Quelltext METH_A_1:
  18. field-symbols: <fs> TYPE ANY.
  19. ASSIGN (‘VAR_B_1’) TO <fs>.
  20.  
  21. Ergebnis:
  22. Sy-subrc = 4
  23. <fs> is not assigned
  24.  
GeSHi ©


Durch die "Friends" Beziehung müsste doch der Zugriff genauso klappen, als wenn die Attribute "Public" sind, oder?
Johann3737
..
..
 
Posts: 13
Joined: Thu May 27, 2010 10:38 am

Re: Zugriff auf Felder aus Unterklasse via Friends

Postby Ines3642 » Wed Feb 20, 2013 8:51 am

Hi! Ohne jetzt nachzusehen: mein Verständnis von "Friends" ist grundsätzlich verschieden von der Vererbung. Bildlich gesprochen sehe ich eine Unterklasse, wie der Name eigentlich schon sagt, "unter" der Superklasse. Eine Friend-Klasse sehe ich immer "neben" der "Superklasse" (hier stört mich auch schon der Begriff "Super").

Insofern weiß ich nicht, ob das Konstrukt so, wie Du es Dir vorstellst, überhaupt funktionieren kann...

Aber hier können die echten OO-Profis sicher weiter helfen. ;)
Ines3642
...
...
 
Posts: 268
Joined: Tue Jan 27, 2009 5:49 pm

Re: Zugriff auf Felder aus Unterklasse via Friends

Postby Johann3737 » Wed Feb 20, 2013 9:04 am

Prinzipiell stimme ich dir absolut zu, nur möchte ich praktisch die "Friend"-Funktionalität auch nur für meien Zwecke "missbrauchen", um halt auch auf Unterklassen voll zugreifen zu können.
Johann3737
..
..
 
Posts: 13
Joined: Thu May 27, 2010 10:38 am

Re: Zugriff auf Felder aus Unterklasse via Friends

Postby Ines3642 » Wed Feb 20, 2013 10:07 am

...und ich glaube eben, dass dies nicht so einfach geht.

Meine Idee für "Friends", die ich leider bisher noch nicht testen konnte: ich wollte mir eine eigene CL_GUI_ALV_GRID basteln. Die Standard-Klasse ist gut, keine Frage, gewisse Dinge müssen aber dennoch immer dazu gebaut werden, um sie zu nutzen. Diese wollte ich in einer eigenen Klasse hinzufügen, welche quasi eine erweiterte Kopie der Originalklasse ist.

Bei der Vererbung hast Du das Problem mit den Sichtbarkeiten (private wird ja z.B. nicht vererbt). Dieses kannst Du mit den Friends umgehen, aber "Vollzugriff" hast Du dann noch lange nicht, der kommt nur "von innen" (in Deinem Friend, nicht in der "Superklasse").

Aber würde es denn nicht umgekehrt funktionieren? Also mit einem Zugriff aus der Unterklasse auf die Oberklasse?
Ines3642
...
...
 
Posts: 268
Joined: Tue Jan 27, 2009 5:49 pm

Re: Zugriff auf Felder aus Unterklasse via Friends

Postby Johann3737 » Wed Feb 20, 2013 10:13 am

Natürlich klappt der Zugriff aus der Unterklasse auf Attribute der Oberklasse, vor allem, weil ich die relevanten Daten auf "Protected" setze. Aber in meinem Fall ist es nunmal genau so wie beschrieben. Wenn ich den gesamten Aufbau umkremple finde ich bestimmt eine Lösung, aber diese Frage stelle ich ja gar nicht.
Ich frage mich eben nur, warum die Logik mit "Friend"-Beziehung nicht funktioniert. Wie beschrieben hat es mit "public" Attributen ja auch geklappt.

Ich habe den Bezug auf dein Beispiel für eine ALV-Klasse noch nicht verstanden. Was willst du dort mit "Friend"-Klassen erreichen?
Johann3737
..
..
 
Posts: 13
Joined: Thu May 27, 2010 10:38 am

Re: Zugriff auf Felder aus Unterklasse via Friends

Postby Ines3642 » Wed Feb 20, 2013 10:21 am

Zum ALV-Friend: es gibt in der ALV-Klasse einige private/protected Teile, auf die ich gerne "direkt" zugreifen würde. Mit einem Friend sollte ich das doch können, oder?

Es verhält sich hier im Grunde so, wie Du es vorhast, nur eben in umgekehrter Reihenfolge.

...aber vielleicht geht das bei Dir auch so, einfach die Oberklasse zum Friend der Unterklasse machen? (falls das technisch überhaupt möglich ist)
Ines3642
...
...
 
Posts: 268
Joined: Tue Jan 27, 2009 5:49 pm

Re: Zugriff auf Felder aus Unterklasse via Friends

Postby Johann3737 » Wed Feb 20, 2013 11:30 am

Ich denke nicht, dass es hilft, wenn ich die Oberklasse als Friend der Unterklasse mache, denn zum einen erbt die Unterklasse ja schon, zum anderen geht es ja nicht darum, auf Attribute der Oberklasse zugreifen zu können.

In deinem Beispiel könnte es aber helfen, aber durch mein aktuelles Problem wäre ich mir da auch nicht 100%ig sicher :)
Johann3737
..
..
 
Posts: 13
Joined: Thu May 27, 2010 10:38 am

Re: Zugriff auf Felder aus Unterklasse via Friends

Postby Ayla149 » Wed Aug 28, 2013 8:01 pm

Wenn Klasse B von Klasse A abgeleitet ist, aber Klasse A auf private Daten oder Methoden der Klasse B zugreifen soll, hast du grundsätzlich mal ein Problem in deinem Datenmodell.
Für mich ist das nicht schlüssig (->brauche Input :)). Ggf. brauchst du keine Vererbung.
Oder wenn du Attribute initial setzen willst, kannst du das auch über den Konstruktor tun.
Ayla149
..
..
 
Posts: 24
Joined: Wed Dec 17, 2003 5:22 pm


Return to ABAP Objects®

Who is online

Users browsing this forum: No registered users and 7 guests