Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#2

AW: [Tutorial] Den Destruktor verstehen

  Alt 15. Apr 2012, 06:13
Zitat:
// schlechter Stil: unnötiger Code und unnötiger Eintrag in der VMT
Fast richtig.
- ja, es ist unnötiger Code
- nein, es ist kein unnötiger Eintrag in der VMT

Denn die VMT gibt es so oder so.
- hat man was überschrieben, dann steht die eigene Methode drin
- wurde es nicht überschrieben, dann steht darin die letzte Methode des Vorfahren

Und das Destroy immer public sein muß, stimmt auch nicht.
Da diese Methode über die VMT und nicht über die RTTI gesucht wird, kann sie als alles deklariert überschrieben sein, da Free bei Freigabe über TObject und dessen Sichtbarkeiten geht.
Nur daß Nachfahren es schwer hätten das zu überschreiben, wenn es private ist.
Ich persönlich hätte dieses Destroy als Protected deklariert, was zu weniger Problemen geführt hätte. (kann muß Free aufrufen, da Destroy nicht von außen erreichbar ist)

Zitat:
Borland wollte offensichtlich dem Programmierer die Möglichkeit geben, den Destruktor direkt aufzurufen.
Ich hab eher das Gefühl man hat garnicht nachgedacht.
In der Deklaration von TObject findet man garnichts von Sichtbarkeiten ... das hatte man wohl einfach vergessen.
Das ist zumindestens in älteren Delphis so, was man inzwischen (D2010) geändert hat, aber vermutlich aus Gründen der Abwärtskompatibilität hat man lediglich das Public eingebaut und nicht gleich mal Einiges nach Protected verschoben.
Wobei ich diese angebliche Abwärtskomatibilität, wie gesagt, eh sinnlos finde, da es im Notfall dennoch sichtbar gemacht werden könnte, dort wo es wirklich unbedingt nötig währe.

Oftmals sind auch Methoden als Published deklariert, obwohl sie eigentlich nur als Public gedacht waren,
denn meistens wird zu Anfang garkeine Sichtbarkeit angegeben, da kommt ohne Angabe gleich die erste Methode in der Deklaration.
Und bei TPersistent-Nachfahren wurde die Standardsichtbarkeit von Public auf Published geändert wurde, womit diese Methoden dann automatisch Published sind.
Oder Schlimmer, vieles ist Private, was besser Protected gewesen währe.

Zitat:
Warum braucht man überhaupt das inherited im Destruktor? Könnte Delphi das nicht automatisch aufrufen?
Gute Frage! In anderen Programmiersprachen (z.B. C++, C#) ist es tatsächlich so,
dass automatisch die ererbten Destruktoren aufgerufen werden, ohne dass sich der Programmierer darum kümmern müsste.
Und was währe, wenn ich was überschreiben will, ohne daß die Vorfahrmethoden ausgeführt werden?
Und außerdem kann man über das Inherited entscheiden wann der Vorfahr ausgeführt wird. (zu Anfang, zwischendrin, am Ende oder garnicht)




Jetzt fehlt nur noch der Constructor.

Auch der Class Constructor und Class Destructor währen eine Erwähnung wert.
Das sind die neuen Initialization und Finalization, aber ohne gewisse Nachteile, welche viele kennen und weswegen oftmals bei NonVCL Units wie SysUtils weggelassen werden. (Dateigröße)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Apr 2012 um 06:34 Uhr)
  Mit Zitat antworten Zitat