Autor Beitrag
Yacoon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72



BeitragVerfasst: Do 20.02.03 13:24 
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 20.02.03 14: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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 20.02.03 15: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:
ausblenden 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;
...


ausblenden 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


Zuletzt bearbeitet von Udontknow am Do 20.02.03 16:08, insgesamt 1-mal bearbeitet
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 20.02.03 16: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