AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DynArray: array of TShape

Ein Thema von Char · begonnen am 21. Okt 2003 · letzter Beitrag vom 22. Okt 2003
Antwort Antwort
Seite 2 von 2     12   
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: DynArray: array of TShape

  Alt 22. Okt 2003, 14:19
Moin Char,

der eigentliche destructor heisst i.d.R. Destroy.
Free führt noch Prüfungen durch, bevor es dann Destroy aufruft.

Die eigentliche Freigabe findet also in Destroy statt, das von Free aufgerufen wird.
Nennen kannst Du den natürlich wie Du willst, aber Free ist von seinem Sinn her vorbelegt, so dass es zumindest ungeschickt wäre den destructor so zu nennen. Zudem ist es Konvention einen destructor Destroy zu nennen (genauso wie der constructor üblicher Weise Create heisst.)

inherited heisst, dass die Methode gleichen Namens von der Basisklasse Deiner Klasse an dieser Stelle aufgerufen wird.
Gibst Du hier noch einen Namen mit (z.B. inherited MethodenName) so wird die Methode "MethodenName" der Basisklasse aufgerufen.
Ggf. sind dann noch Parameter zu übergeben.
Stimmt Deine Deklaration mit der der Basisklasse überein kannst Du den Namen und die Parameter weglassen, da diese automatisch übernommen werden.

BTW:
Ich hab' hier auch Blödsinn geschrieben: "Das inherited ist zwar bei Ableitung von TObject nicht zwingend erforderlich, da es hier nichts zu erben gibt, "
Man ruft ja den Destructor von TObject auf, und das sollte auch so sein.

Jetzt musst Du nur noch darauf achten, an welcher Stelle das inherited gesetzt wird.
Bei einem constructor sollte inherited als erstes aufgerufen werden, da es ja sinnvoll ist alles was von vorherigen Klassen stammt zu initialisieren, bevor man seine eigenen Ergänzungen initialisiert.
Aus dem gleichen Grunde gehört inherited beim Destructor ans Ende. Erst einmal die eigenen Sachen aufräumen, dann dass was aus vorhergehenden Klassen stammt.

Bei anderen Methoden die man überschreibt hängt es vom Zusammenhang ab, an welcher Stelle man das inherited einfügt. Meistens wohl als erstes, im Extremfall vielleicht auch gar nicht.

Zitat von Char:
Wenn das Programm beendet wird, werden dann alle Objekte automatisch destroyed oder freed oder muss ich den destructor von meiner Klasse selbst aufrufen? Ich gehe von letzterem aus.
Windows sollte zwar in der Regel alles abräumen, was ein Prozess so an Resourcen belegt hat, aber es ist allemal sauberer dieses immer selber zu machen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Char

Registriert seit: 17. Okt 2003
21 Beiträge
 
#12

Re: DynArray: array of TShape

  Alt 22. Okt 2003, 14:48
Also muss in meinen Constructor auch inherited ja?

Wieso funktioniert es denn dann auch ohne? TSCtrl ist ja eine Ableitung von TObject, wieso wird das Objekt ordnungsgemäß erstellt, wenn gar nicht die Create-Prozedur von TObject aufgerufen wird, sondern "nur" meine?

Und: Wieso geht inherited Free nicht? Free überprüft doch nur, ob das Objekt nicht vorher nil ist, weil Destroy alleine da nen Fehler ausgibt oder?

Fragen über Fragen...

[edit]

Wenn ich inherited in den Constructor schreibe kommt folgende Fehlermeldung:

[Fehler] USCtrl.pas(34): Inkompatible Typen

Und wenn ich den Destructor umschreibe kommt eine Warnung:
[Warnung] USCtrl.pas(22): Methode 'Destroy' verbirgt virtuelle Methode vom Basistyp 'TObject'

Was ist überhaupt eine virtuelle Methode (virtual)?
[/edit]
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: DynArray: array of TShape

  Alt 22. Okt 2003, 15:43
Moin Char,

wenn Du es so schreibst

Delphi-Quellcode:
type
  TcsMyType = class(TObject)
  public
    constructor Create(const AsIrgendeinParameter : string);
    destructor Destroy; override;
  end;

implementation

{ TcsMyType }

constructor TcsMyType.Create(const AsIrgendeinParameter: string);
begin
  inherited Create;
  // ...
end;

destructor TcsMyType.Destroy;
begin
  //...
  inherited;
end;
sollte es gehen.

Beim inherited im constructor musst Du den Aufruf der Basisklasse so mitgeben, wie er in der Basisklasse deklariert ist, wenn Deine Deklaration davon abweicht.
Es wird vermutlich ohne inherited gehen, wenn in TObject.Create nichts initialisiert wird.

Zum Thema virtuelle Methoden kannst Du ja erst einmal in der Hilfe unter eben diesem Begriff nachschlagen. Ich finde, dass ist da ganz gut erklärt.
GGf. wäre es dann vielleicht sinnvoll mal einen neuen Thread aufzumachen, denn irgendwie sind wir hier, bezogen, auf Deine Eingangsfrage, schon lange OT
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz