![]() |
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 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