AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Kurzreferenz
Tutorial durchsuchen
Ansicht
Themen-Optionen

Delphi Kurzreferenz

Ein Tutorial von Luckie · begonnen am 20. Dez 2010 · letzter Beitrag vom 7. Jan 2011
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 16:50
Allgemein:
Es muss eig. nicht immer inherited aufgerufen werden. Bei Konstruktoren schon gar nicht und bei Destruktoren kann man es weg lassen, wenn man von TObject ableitet
Wenn man im Konstruktor das inherited nicht aufruft, dann wird keiner der ererbten Konstruktoren aufgerufen.
Das kann zu Zugriffsfehlern führen, wenn dadurch z.B. in der Basisklasse eingebettete Objekte nicht angelegt werden.
Beim Destruktor kann ein fehlendes inherited zu Speicherlecks und Resourcenverlust führen.
Man ist nur dann auf der sicheren Seite wenn man grundsätzlich immer inherited verwendet.
Der Name der Basisklasse ist ja ganz leicht von TObject auf eine andere Klasse geändert;
wenn man im Konstruktor oder Destruktor schlampig war können leicht (sehr heimtückische) Probleme auftreten.

Auch dass inherited als letzte Anweisung im Destruktor stehen muss finde ich so nicht richtig. In den meisten Fällen wir dies wohl stimmen, aber es gibt auch Szenarien, wo es so nicht geht.
Nach dem Aufruf von inherited ist das Objekt freigegeben, jeder Zugriff auf ein Feld des Objekt ist also ein Zugriff auf ungültigen Speicher.
Oftmals bleibt der Zugriff auf den freigegebenen Speicher folgenlos, aber man hat eine tickende Zeitbombe im Sourcecode!
Delphi-Quellcode:
destructor TKlasseXY.Destroy; // Beispiel für potentiell gefährlichen Code
begin
  inherited;
  // Ab diesem Zeitpunkt ist "FHandle" ungültiger Speicher
  CloseHandle(FHandle); // dieser Aufruf kann zu einer Zugriffsverletzung führen
end;
Also ich kenne kein Szenario in dem es nötig wäre nach den Aufruf von inherited noch etwas anderes zu tun.
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 17:07
War ja klar das meine Worte wieder mal angezweifelt werden und ich als doof abgestempelt werde

Beispiel aus der Classes.pas, wo KEIN inherited stehen sollte:
Delphi-Quellcode:
constructor TStringStream.Create;
begin
  Create('', TEncoding.Default, False);
end;
Solche Konstrukte gibt es zu tausenden. Es zu einem Dogma zu machen, dass in einem Konstruktor inherited vorkommen muss, ist somit einfach nicht richtig.

Beispiel, wo der geerbte Konstruktor und Destruktor nicht in der dogmatisch genannten Reihenfolge aufgerufen werden:
Delphi-Quellcode:
constructor TAbgeleiteteKlasse.Create;
begin
  FStream := TMemoryStream.Create;
  inherited Create(FStream);
end;

destructor TAbgeleiteteKlasse.Destroy;
begin
  inherited; // Könnte ja auf den übergebenen Stream noch zugreifen.
  FStream.Free;
end;
Ich kenne auch niemanden, der jüdischen Glaubens wäre. Und trotzdem gibt es Juden
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 17:27
Delphi-Quellcode:
constructor TStringStream.Create;
begin
  Create('', TEncoding.Default, False);
end;
Solche Konstrukte gibt es zu tausenden.
Darum müssen sie ja noch längst nicht richtig sein.
Auf den ersten Blick frage ich mich "wo ist das Create was hier aufgerufen wird".

Es zu einem Dogma zu machen, dass in einem Konstruktor inherited vorkommen muss, ist somit einfach nicht richtig.
Aber vielleicht zur Regel? Und da kann es Ausnahmen geben.
(zumindestens in TObject.Create sollte es kein inherited geben)

Ich kenne auch niemanden, der jüdischen Glaubens wäre. Und trotzdem gibt es Juden
Eben. Aber Deine Aussagen könnten leicht so interpretiert werden, als wäre die halbe Bevölkerung jüdischen Glaubens, und das ist glaube ich, nicht richtig.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 18:01
Darum müssen sie ja noch längst nicht richtig sein.
Sind sie aber. Richtig, weit verbreitet und nicht mal schlechter Programmierstil.

Auf den ersten Blick frage ich mich "wo ist das Create was hier aufgerufen wird".
Schau doch in deine eigene Classes.pas?! Klar wird in dem aufgerufenen Konstruktor inherited aufgerufen. Aber zum 3. mal: Es muss somit nicht in jeden! In jedem 2. Thread im Forum wird gesagt, dass die Fragesteller nicht einfach Copy-und-Paste nutzen sollen, sondern den Code verstehen sollten. Wie kann man dann hier meinen, dass man Anfängern einfach sagt, dass inherited am Anfang eines jeden Konstruktors zu stehen hat, ohne ihm zu erklären warum man das (fälschlicher weise) meint.


Eben. Aber Deine Aussagen könnten leicht so interpretiert werden, als wäre die halbe Bevölkerung jüdischen Glaubens, und das ist glaube ich, nicht richtig.
Dann nimm halt Inder. Davon gibt es ein paar mehr. Erbsenzähler -.-
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 19:15
Stopp, stopp, stopp. Eure Diskussion ist ja durch aus interessant und nützlich, aber ich glaube, das bringt mich hier nicht unbedingt weiter.

Also ich rufe generell inherited im Konstruktor auf, auch wenn ich die Klasse von TObject ableite. Auch wenn da noch nichts passiert, kann sich das in zukünftigen Delphi Versionen durchaus ändern. Genauso sehe ich es im Destruktor.

Das Borland das damals nicht konsequent gemacht hat, sehe ich deshalb als Fehler an. Aber die damaligen Borland Programmierer waren auch keine Götter und haben auch Fehler gemacht. Wer weiß, heute würden sie das eventuell auch anders machen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 20:33
Mache ich auch so. Zudem stört ein leerer Aufruf ja auch nicht.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Delphi Kurzreferenz

  Alt 7. Jan 2011, 07:17
Ich habe das Thema Destruktor in den Thread Interessantes Destruktor Problem ausgelagert.
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz