Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:47

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: ClassParent ??
BeitragVerfasst: Sa Nov 05, 2005 12:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
Hi zusammen!
Hab folgendes Problem:
Ich würde gerne von einer Klasse die einer andern Klasse untergeordnet ist auf die Funktionen der übergeordneten zugreiffen..
Ich mach mal ein Beispiel weil das nich so ganz leicht zu verstehen ist aus dem Satz befürchte ich ^^

ich hab z.B.:

Code:
  1.  
  2. type TKlasse1 = class
  3. private
  4.   Klasse2: TKlasse2;
  5.   ...
  6. public
  7.   Procedure Test;
  8.   ...
  9. end;
  10.  

Wie TKlasse2 aussieht ist hierbei egal..
und will dan in einem Codeteil von Klasse2 auf die Procedure Test von Klasse1 zugreiffen..
Habs mal mit ClassParent versucht.. sah dann inetwa so aus:
Code:
  1.  
  2. Procedure TKlasse2.Irgendwas
  3. begin .. usw..
  4. TKlasse1(ClassParent).Test
  5. ...
  6.  

Aber das klappt nicht.. kommt immer irgendwo eine Zugriffsverletzung..
Wie könnte ich das anders machen ?
Danke schonma!
Cya

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 05, 2005 12:59 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Code:
  1. type
  2.   TParent = class
  3.   private
  4.  
  5.   public
  6.     procedure parentProc();virtual;
  7.     procedure parentProcS();
  8.   end;
  9.  
  10.   TChild = class(TParent)
  11.   private
  12.  
  13.   public
  14.     procedure parentProc();override;
  15.     procedure parentProcS();
  16.   end;
  17.  
  18. var
  19.   Form1: TForm1;
  20.  
  21. implementation
  22.  
  23. {$R *.dfm}
  24.  
  25. { TChild }
  26.  
  27. procedure TChild.parentProc;
  28. begin
  29.   inherited;
  30.   messageBox( 0, 'TChild.parentProc wurde aufgerufen', 'proc', 0);
  31. end;
  32.  
  33. procedure TChild.parentProcS;
  34. begin
  35.   messageBox( 0, 'TChild.parentProcS wurde aufgerufen', 'proc', 0);
  36. end;
  37.  
  38. { TParent }
  39.  
  40. procedure TParent.parentProc;
  41. begin
  42.   messageBox( 0, 'TParent.parentProc wurde aufgerufen', 'proc', 0);
  43. end;
  44.  
  45. procedure TParent.parentProcS;
  46. begin
  47.   messageBox( 0, 'TParent.parentProcS wurde aufgerufen', 'proc', 0);
  48. end;
  49.  
  50. procedure TForm1.Button1Click(Sender: TObject);
  51.   var p:TParent;
  52.       c:TChild;
  53. begin
  54.   p := TParent.Create;
  55.   c := TChild.Create;
  56.  
  57.   p.parentProc;
  58.   p.parentProcS;
  59.  
  60.   c.parentProc;
  61.   c.parentProcS;
  62.  
  63.   TParent(c).parentProcS;
  64.  
  65.   c.Free;
  66.   p.Free;
  67. end;
  68.  
Keine Zugriffverletzung. ;)

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 05, 2005 13:37 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
@sniper.w
Das will er doch garnicht.
Klasse2 ist eine Variable innerhalb Klasse1.
Und in Klasse2 will er auf Klasse1 zugreifen.

Meines Wissens aber nicht möglich, da Klasse2 irgendwo existieren könnte und nicht im Kontext von Klasse1 ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 05, 2005 13:59 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Sorry.

Wenn ein Feld einer Klasse auch selbst eine Klasse ist, heisst das nicht das die Klasse-Owner auch ein Parent von seinem Feld ist.

In deinem Fall ist Klasse1 kein Parent von Klasse2.

Es bitet sich ein Trick zu benutzen :

Code:
  1.  
  2. type tklasse2 = class
  3. private
  4.  Fowner : TKlasse1;
  5. public
  6.  construction Create( aOwner: TKlasse1 );
  7. end;
  8. //....
  9.  Klasse2 = TKlasse2.Create( Klasse1 );
  10.  

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 05, 2005 14:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
Danke für die Antworten erstma!
Das sieht ganz gut aus ich werds ma probieren!

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 06, 2005 00:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
So also habs bissel anders geregelt.. so wie du das beschrieben hast geht das nicht weil sich die deklarationen kreuzen ^^ hättest das mit TObject machen müssen und dann mit Klasse2(TObject).Test usw machen müssen..
Und so ähnlich hab ichs dann auch gemacht.. hab nur PObject = ^TObject benutzt um bissel datenschieberei zu sparen..
also sähe dann so aus..
Code:
  1.  
  2. type  PObject = ^TObject
  3.  
  4.         Klasse1 = class
  5.         private
  6.           pOwner: PObject
  7.           dings: Klasse2;
  8.         public
  9.           constructor.Create(wOwner: PObject);
  10.           procedure Muh;
  11.         end;
  12. ...
  13. constructor Klasse1.Create(...);
  14. begin
  15.   pOwner := wOwner;
  16. end;
  17. ...
  18. procedure Klasse2.Test(...);
  19. begin
  20.   Klasse1(pOwner^).Muh;
  21. end;
  22.  

so inetwa.. habs das jetz ma so hingeschrieben kann also sein dasses nich ganz korrekt is aber vom Prinzip her sollte man erkennen wie ichs meine!
Cya!

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 06, 2005 00:24 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Anmerkung:
Eine Variable/Instance irgendwelche klasse ist immer ein Pointer.

var a:TObject;
form:TForm;

A ist ein Pointer auf eine instance of TObject.
form = pointer auf eine instance of TForm

^TObject = pointer to pointer to object.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 06, 2005 10:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Kann mich sniper nur anschließen. Klassen sind bereits Pointer und einen Pointer auf eine Klasse macht nur in sehr seltenen Fällen überhaupt sinn. Vor allem, wenn man bedenkt, dass du dann einen normalen Pointer hast und diesen erst beim Casten wieder zu einer Klasse machst. Wenn du dich dann vertust kann es schnell mal passieren, dass eine Instanz vermeindlich als etwas anderes ansprechen möchtest. Um Snipers beispiel mal etwas auszuholen.

Code:
  1. var
  2.   a: TObject;
  3.   form: TForm;
  4. begin
  5.   a := form;
  6.  
  7.   // A ist von TForm abgelitten
  8.   if a is TForm then
  9.     Form := TForm(a);
  10.  
  11.   // A ist vom Typ TForm
  12.   if a.ClaasType = TForm then
  13.     Form := TForm(a);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 06, 2005 11:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
bei Pointern auf TObject muss man außerdem aufpassen, dass die variable, auf die man dann pointed auch bestehen bleibt (zB wenn man in einer Prozedur der Klasse auf self pointen lässt kann das böse ärger geben)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]