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