OOP - Designproblem

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Robert
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 36
Registriert: Mo, 13. Feb 2006 12:47

OOP - Designproblem

Beitrag von Robert »

Hallo,

folgende Situation:

Ich habe eine von Thread() abgeleitete Klasse "myThread" sowie eine Klasse "myObject" mit einer bestimmten Aufgabe.

Im angegebenen Intervall werden nun in der Methode execute() der Klasse "myThread" unter bestimmten Voraussetzungen Objekte der Klasse "myObject" erzeugt.

Code: Alles auswählen

METHOD myThread:execute()
   [...]
   obj := myObject():new(p1,p2,...)
   [...]
RETURN self
Das heißt, die Anzahl möglicher Objekte zur Laufzeit ist variabel.

Bestimmte Methoden dieser Klasse dürfen nicht verändert werden.
Jedoch möchte ich dem Anwender die Möglichkeit geben eigene Methoden hinzuzufügen oder bestehende um spezifischere Aufgaben zu erweitern.

Leitet man aber nun eine Klasse von "myObject" ab würde das ganze momentan nicht funktionieren, da ich mich ja nicht mehr auf die Klasse "myObject" beziehen kann.

Das einzige, was mir momentan einfällt, wäre die Verwendung des &-Operators. Dann müsste ich den Klassennamen an "myThread" übergeben. Finde ich persönlich nicht so schön und man könnte der Methode init() der von "myObject" abgeleiteten Klasse keine zusätzlichen Parameter übergeben.

Alternativ könnte man eine Klasse Creator erstellen, der man den Klassennamen und die Parameter übergibt, welche dann daraus die Eigentliche Anweisung zusammenbaut und das Objekt erzeugt.
In der execute-Methode würde dann eine anstelle von

Code: Alles auswählen

obj := myObject():new(p1,p2,...) 
die entsprechende Methode der Klasse Creator aufgerufen.

Aber ist das dann noch im Sinne der Objektorientierten Programmierung bzw. gibt es da nicht eine "vernünftigere" Lösung?

Bin für jeden Vorschlag dankbar.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Robert,
Vielleicht hilft dir das nachfolgende Beispiel weiter:

Code: Alles auswählen

CLASS MyThread
    exported:
    oExecuteObj  

   METHOD init
ENDCLASS

METHOD MyThread:execute()
    ::oExecuteObj := MyOwnObject():new(p1, p2)
    ::oExecuteObj:ShowMess( "test") 
    ::oExecuteObj:ShowDate() 
Return self 



Class MyObj
   exported: 
   METHOD INIT, ShowMess
ENDCLASS

METHOD MyObj:INIT( p1, p2)
Return self

METHOD MyObj:ShowMess( cMess )
   msgbox( cMess )
return nil
    

Class MySecondObj from MyObj  // Erbt alle Funktionalitäten von MyObj und kann ggf. um eigene Methoden erweitert werden.
   exported:
   METHOD Init, ShowDate
ENDCLASS

Method MySecondObj:init()
return self

METHOD MysecondObj:ShowDate()
    msgbox("Datum" + DtoC( date () )
Return NIL

Gruß, Olaf
Robert
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 36
Registriert: Mo, 13. Feb 2006 12:47

Beitrag von Robert »

Hallo,

hast du in deinem Beispiel die Klasse MyOwnObject vergessen?
Wenn nein, dann kann ich das ganze nicht so wirklich nachvollziehen.

Ansonsten vermute ich mal, dass mir die Klasse MyOwnObject eine Instanz der Klasse MySecondObj zurückliefert?

Dazu habe ich neulig erst eine Anregung bekommen zum Thema "Factory"
(http://www.dofactory.com/Patterns/Diagrams/factory.gif)

Kann ich dein Beispiel in diese Thematik einordnen?

So jedenfalls denke ich sollte es jedenfalls funktionieren.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Ja, die Klasse "MyOwnObject" ist gleichbedeutend mit mein "MySecondObject()". Da habe ich wohl zu schnell getippt. Sorry.

Dazu grundsätzliches:

Über die Membervariable ::oExecuteObj ( in diesem Beipiel) kannst Du auf alle Methoden der Super- und Kinderklassen" zugreifen, soweit diese "exported" sind. Und es zeigt Dir eine Möglichkeit, wie Anwender beliebig das "ExecuteObjekt" erweitern könnten, indem die Eigenschaften dieser Klasse einfach vererbt werden.
Antworten