Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - OOP in Delphi
Yacoon - Do 20.02.03 12:24
Titel: OOP in Delphi
Hi zusammen, habe folgendes Problem. Ich denke aber das ihr mir helfen könnt. Also...
Ich habe ein Objekt namens TMutterObjekt. Dieses Mutterobjekt hat die Eigenschaft Benutzer. Des weiteren hat die Klasse eine Methode zur Stapelverarbeitung namens MeineFunktion.
Diese Funktion erstellt für jeden Benutzer ein Objekt vom Typ TThread in dem die Verarbeitung für den Benutzer ablaufen soll.
In dem Objekt, also der Klasse vom Typ TThread möchte ich dann die Daten von dem jeweiligen Benutzer verarbeiten. Dazu muss ich auf die Daten in der Eigenschaft Benutzer in der Mutterklasse zugreifen.
Wenn ich aber in der Klasse vom TThread meine Unit der Mutterklasse einbinde und darauf zugreife, ist mein erstelltes Objekt nicht vorhanden. Also ich müsste ein neues Objekt erstellen bla bla bla.
Wie greife ich nun aber von der ChildKlasse auf die Eigenschaft einer Mutterklasse zu?
In C kann ich das ja mit :: machen. Aber wie geht das mit Pascal?
Wäre echt super, wenn mir da einer weiter helfen könnte.
Klabautermann - Do 20.02.03 13:31
Hi,
| Yacoon hat folgendes geschrieben: |
| In C kann ich das ja mit :: machen. Aber wie geht das mit Pascal? |
Der Scope-Operator (::) wird in Delphi durch das Schüsselwort
inherited representiert.
Mit einem einfachen Aufruf von
inherited wird die Funktion aus dem Mutterobjekt aufgerufen die den Selben Namen und die Selbe Parameterliste wie die Aktuelle Funktion hat. Dabei werden alle Parameter an den vorfahren übergeben.
Es ist aber auch möglich nach
inherited einen funktionsnamen mitsammt Parameter zu übergeben.
Quelltext
1:
| inherited MeineFunk('Hallo', Parameter2, NIL); |
Wenn du mehtoden nicht überschreibst/verdeckst kannst du aus deinem Kindobjekt direckt drauf zugreifen, solange diese nicht als
Private deklariert wahren.
Private Deklarationen stehen den Kindobjekten also nicht zur verfügung, deshalb sollte wenn dies nciht erwünscht ist
Protected verwendet werden.
Gruß
Klabautermann
Udontknow - Do 20.02.03 14:49
Hi!
Also irgendwie weiss ich überhaupt nicht, wovon geredet wird. Zunächst dachte ich "Hmm, da hat einer eine Frage zur Aggregation." Dann aber "Oh, er hat ein Problem mit der Referenzierung zwischen Units!". Doch dann las ich Klabautermanns Beitrag, der etwas von Vererbung & Co. erzählte...
Ich gehe einfach mal davon aus, daß du gerne wüsstest, wie du von einem Unterobjekt auf das beinhaltende Objekt zugreifst.
Ich mache es immer so, daß ich eine Eigenschaft Owner (ähnlich wie in TComponent realisiert) den Unterobjekten mitgebe, so dass ich dann per Typkonvertierung das Mutterobjekt ansprechen kann.
Bsp:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| unit u1;
interface
uses u2;
type TMutterklasse=class(TObject) public Benutzer:String; UnterObjekt:TUnterobjekt; function MeineFunktion:Boolean; end; ... |
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| unit u2;
interface
type TUnterObjekt=class(TObject) public Owner:TObject; function Benutzer:string; end;
implementation
//Realisierung der Referenz im Implementationbereich, ansonsten //nicht zulässiger zirkulärer Verweis uses u1;
function TUnterObjekt.Benutzer:string; begin Result:=TMutterklasse(Owner).Benutzer; end; |
Wenn du allerdings direkt den Owner als TMutterklasse deklarieren willst, müssen die zwei Klassen in derselben Unit sein.
Eine weitere Methode ist die Referenzierung über Interfaces, wo dann gar kein direkter Bezug der Units untereinander sein muss.
Cu,
Udontknow
Klabautermann - Do 20.02.03 15:07
Hallo,
| Udontknow hat folgendes geschrieben: |
| Also irgendwie weiss ich überhaupt nicht, wovon geredet wird. |
ich muss zugeben mir geht es nciht viel anders. Deshalb habe ich mich auf den Satz von Yacoon bezogen in dem er Explizit nach dem Scope-Operator aus C++ fragt ( :: ) und ihm die Delphi Entsprechung dazu (inherited) geliefert. Weil ich mir nicht sicher binn ob dies wirklich das Problem ist habe ich noch versucht ein wenig Aufklährungsarbeit in Bezug auf Protected/Private zu leisten.
Gruß
Klabautermann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!