![]() |
Was bedeutet 'final'?
Hi!
Ich bin in der Delphi-Hilfe auf das reservierte Wort 'final' gestoßen. Allerdings sagt mir die Erklärung dort nicht wirklich viel: Zitat:
Hab weder hier noch auf DSDT noch bei Google ne Erklärung gefunden. |
Re: Was bedeutet 'final'?
Also, die Erklärung ist doch verständlich. Die mit final deklarierte Methode, kann von abgeleiteten Klassen nicht mehr überschrieben werden
|
Re: Was bedeutet 'final'?
Aber es können doch sowieso nur Methoden überschrieben werden, die virtuell oder dynamisch sind. Was ist eine "finale virtuelle Methode"? Ich sehe darin noch einen Widerspruch in sich.
|
Re: Was bedeutet 'final'?
das final wird auch nicht in der Basisklasse verwendet, sondern in der Deklaration in der Unterklasse, die die endgültige Implementation enthält.
|
Re: Was bedeutet 'final'?
Achso. Also in der Basisklasse wird eine Methode als virtuell oder dynamisch deklariert. In einer Unterklasse wird diese Methode überschrieben und erhält neben override noch den Zusatz final. Dadurch kann die Methode in einer Klasse, die von dieser Unterklasse abgeleitet ist, nicht nochmal überschrieben werden. Richtig?
|
Re: Was bedeutet 'final'?
Ja, so verstehe ich das.
|
Re: Was bedeutet 'final'?
Exakt, auf die Art kannst du verhindern, dass Konsumenten deiner Klassen invasive Änderungen vornehmen. Durch überschreiben einer Methode, die außerhalb deines Packages nicht überschrieben werden sollte.
Außerdem kann der Compiler einen Call auf eine final method wie einen statischen Call umsetzen. Das erspart dir zur Laufzeit den Dispatch um die Implementierung zu finden. Es ist also eine weitere Schraube für Optimierungen. |
Re: Was bedeutet 'final'?
Auch statische Methoden können überschrieben werden, nämlich mithilfe von reintroduce.
|
Re: Was bedeutet 'final'?
Zitat:
einfach mal ein Consolen App Project anlegen und den Code reinwerfen:
Delphi-Quellcode:
Es kommt natürlich A A C raus, nicht A B C. ;)
program Bleistift;
{$APPTYPE CONSOLE} type ClassA = class function Test : String; virtual; end; ClassB = class(ClassA) function Test : String; reintroduce; end; ClassC = class(ClassA) function Test : String; override; end; ClassAClass = class of ClassA; function ClassA.Test : String; begin result := 'A'; end; function ClassB.Test : String; begin result := 'B'; end; function ClassC.Test : String; begin result := 'C'; end; procedure Test(classRef : ClassAClass); var inst : ClassA; begin inst := classRef.Create(); Writeln(inst.Test()); inst.Free(); end; begin Test(ClassA); Test(ClassB); Test(ClassC); end. |
Re: Was bedeutet 'final'?
bin soeben auf das Wort "final" gestossen - komme damit aber nicht zurecht. Ich habe keinen Code hingekriegt, bei dem der Compiler final akzeptiert hätte - während in der Ober- noch in der Unterklasse.
Könnte mir jemand ein Codebeispiel geben? |
Re: Was bedeutet 'final'?
Zeig doch erst mal, was bei Dir nicht geht :)
|
Re: Was bedeutet 'final'?
Zitat:
Delphi-Quellcode:
Und wo kommt jetzt das "final" hin?
TOberklasse = class
function getIt: String;virtual; end; TUnterklasse = class(TOberklasse) function getIt: String;override; end; |
Re: Was bedeutet 'final'?
Zitat:
Delphi-Quellcode:
TUnterklasse = class(TOberklasse)
function getIt: String; override; final; end; |
Re: Was bedeutet 'final'?
Zitat:
und arbeite mit Delphi 7 Architect Build 4.453 in der Hilfe gibts nix über final??? ab welcher version gibt´s das :gruebel: |
Re: Was bedeutet 'final'?
Gerade mit meinem Turbo Delphi getestet:
Delphi-Quellcode:
Das gibt keine Fehlermeldung.
type
ClassA = class function Test : String; virtual; end; ClassB = class(ClassA) function Test : String; reintroduce; end; ClassC = class(ClassA) function Test : String; override; final; end; Schreibt man das final zusaetzlich bei ClassA.Test dran, so gibt es eine Fehlermeldung fuer ClassC.Test das die Methode nicht ueberschrieben werden darf. Bei ClassB.Test eingefuegt gibt es eine Fehlermeldung das die Methode nicht virtuell sei und daher kein final haben darf. Offensichtlich impliziert reintroduce nicht virtual. Schreibt man noch virtual dazu dann geht es wieder. Edit: final ist bestimmt nicht vor D8 implementiert. Das stammt vermutlich von den fuer .net noetigen Erweiterungen der Sprache. |
Re: Was bedeutet 'final'?
Zitat:
somit ist wohl auch das Problem von Cöster erklärt... :wink: |
Re: Was bedeutet 'final'?
@Robert:
Vielen Dank für das Beispiel und die Erläuterungen. Das Problem war, dass ich zwei Delphi-Versionen installiert hab (5 und 2006) und ich den Quelltext per Konsole compiliert hab. Der verwendete Compiler war der von Delphi 5. Das kann dann wohl nicht klappen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 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 by Thomas Breitkreuz