Code: Alles auswählen.
METHOD is_modified.
rv_is_modified = non_public_attribute->is_modified( ).
ENDMETHOD.
METHOD set_modified.
non_public_attribute->set_modified( ).
ENDMETHOD.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ewx
Eigentlich schließen sich (1) und (2) ja nicht aus, sondern (2) wäre ein übliches Vorgehen um den angesprochenen Nachteil von (1) überwinden. Ich kann deine Bedenken nur dann teilen, wenn du in diversen Objekten verschiedene Interfaces implementieren willst und du wegen nicht vorhandener Mehrfachvererbung dann eine überfrachtete Basisklasse hast, die alle in Frage kommenden Interfaces implementiert und man an den Unterobjekten nicht mehr direkt sehen kann, ob sie nun das Interface selber benötigen oder nur durch die Ableitung von der Basisklasse schon mal "für den Fall dass du es brauchst" übergestülpt bekommen haben.ewx hat geschrieben:Hallo zusammen!
Variante 2: Vererbung
Ich definiere eine Basisklasse mit den beiden Methoden und lasse die Objekt-Klassen von dieser Klasse erben. Dann muss ich die Implementierung nur einmal in der Basis-Klasse vornehmen. Das möchte ich aber auch nicht, weil "MODIFIED" ja keine Hauptklasse in dem Sinne ist. Wenn ich das einmal gemacht habe, dann kann ich keine weiteren Funktionen nach diesem Muster einbauen.
Code: Alles auswählen.
METHOD is_modified.
rv_is_modified = non_public_attribute->is_modified( ).
ENDMETHOD.
METHOD set_modified.
non_public_attribute->set_modified( ).
ENDMETHOD.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ewx
Code: Alles auswählen.
interface IF_CSP_DOC_MAKER
public .
methods CREATE
importing
!I_SOURCE_ITEM type S_SOURCE_ITEM
changing
!C_ACC_DOCUMENT type S_ACC_DOCUMENT .
endinterface.
class CL_DOC_MAKER_ABS definition
public
abstract
create public .
public section.
interfaces IF_CSP_DOC_MAKER
all methods abstract . "<-- Interface abstrakt definieren
methods SET_DECORATEE
importing
!I_DOC_WORKER type ref to IF_CSP_DOC_MAKER .
protected section.
data DECORATEE type ref to IF_CSP_DOC_MAKER .
private section.
ENDCLASS.
class CL_DOC_MAKER_A definition
public
inheriting from CL_DOC_MAKER_ABS
final
create public .
public section.
methods IF_CSP_DOC_MAKER~CREATE
redefinition .
protected section.
private section.
ENDCLASS.
ich habe ehrlich gesagt das Problem nicht 100% erfassen können - dafür bin ich glaub ich noch zu grün hinter den Öhrchen....Es geht ja gar nicht so sehr um den Decorator, sondern um die Möglichkeit Interfaces abstrakt in einer abstrakten Klasse zu definieren, die dann in der jeweiligen konkreten Implementierung ausprogrammiert werden, aber gleichzeitig Attribute und Methoden der abstrakten Klasse zu nutzen, damit man eben nicht alles konkret in der "Kind"-Klasse implementieren muss. Das "Decoratee"-Attribut ist ja immer eine konkrete Instanz. Und natürlich können auch mehrere Attribute existieren.
Kannst du dir noch mal die Mühe machen und ein konkretes Beispiel liefern, bitte?erp-bt hat geschrieben:Hi,
Es geht ja gar nicht so sehr um den Decorator, sondern um die Möglichkeit Interfaces abstrakt in einer abstrakten Klasse zu definieren, die dann in der jeweiligen konkreten Implementierung ausprogrammiert werden, aber gleichzeitig Attribute und Methoden der abstrakten Klasse zu nutzen, damit man eben nicht alles konkret in der "Kind"-Klasse implementieren muss. Das "Decoratee"-Attribut ist ja immer eine konkrete Instanz. Und natürlich können auch mehrere Attribute existieren.
ewx hat geschrieben:Hallo zusammen!
Ich stehe mal wieder auf dem OO-Schlauch...
Ich habe mehrere Objekte die alle die gleiche Funktionalität bekommen sollen: IS_MODIFIED?
Dafür brauche ich die Methoden SET_MODIFIED und IS_MODIFIED sowie mindestens ein Attribut.
Variante 1: Interface
Ich definiere ein Interface und definiere die Methoden. Das Interface binde ich dann in die benötigten Klassen ein. Allerdings muss ich die Implementierung dann in jeder Klasse vornehmen. Das möchte ich nicht.
Variante 2: Vererbung
Ich definiere eine Basisklasse mit den beiden Methoden und lasse die Objekt-Klassen von dieser Klasse erben. Dann muss ich die Implementierung nur einmal in der Basis-Klasse vornehmen. Das möchte ich aber auch nicht, weil "MODIFIED" ja keine Hauptklasse in dem Sinne ist. Wenn ich das einmal gemacht habe, dann kann ich keine weiteren Funktionen nach diesem Muster einbauen.
Variante 3: (Interface ->) Attribut -> Klasse
Ich definiere eine Klasse mit den beiden Methoden und dem Kennzeichen "modified". Diese Klasse binde ich entweder direkt in meine Objekt-Klassen ein.
Nachteile:
- Das modified-Objekt muss instanziiert werden. Nicht schlimm aber auch nicht schön.
- Der Zugriff erfolgt immer über Attribut->Methode. Die Methode gehört also irgendwie nicht wirklich zu der Objektklasse...
Variante 4: Modified-Controller
Ich erstelle einen Controller in dem ich mir mittels ZCL_HELPER_MODIF=>SET_MODIFIED( Objekt-Klasse ) merke, welche Objekte geändert wurden.
Mit IS_MODIFIED( Objekt-Klasse ) bekäme ich einfach wieder raus, ob das Objekt geändert wurde.
oder es erfolgt ein RAISE EVENT i_am_modified( me ).
Herausforderung:
Ich habe ein Hauptobjekt mit Unterobjekten:
Hauptobjekt z.B. LIEFERBELEG
Unterobjekte z-B.
- Texte
- Packstücke
Wenn "Texte" geändert wurden, dann meldet das Texte-Objekte, dass es geändert wurde.
Lieferbeleg-Objekt muss natürlich seine Objekte nach Änderungen abfragen, das ist klar.
Es sollte also eine einheitliche Schnittstelle nach Außen geben (Interface) mit der Möglichkeit, die Funktionalität selbst in einem eigenen Objekt zu haben.
Das ganze sollte zudem nur lose an das Objekt gekoppelt sein. Ich möchte gegebenenfalls noch andere generische Funktionalitäten anbinden, wie z.B. "HASH-Wert des Objektes ermitteln", "Bearbeitung auf 'Anzeige' setzen" oder ähnliches.
Hat jemand eine gute Idee/ Entwurfsmuster dafür?
Gruß und schönes WE!
Folgende Benutzer bedankten sich beim Autor gtoXX für den Beitrag (Insgesamt 2):
ralf.wenzel • ewx
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
gtoXX
So hatte ich das noch gar nicht gesehen...gtoXX hat geschrieben:Im Endeffekt willst Du eine Art Observer Pattern.