Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was bedeutet 'final'? (https://www.delphipraxis.net/80234-bedeutet-final.html)

Cöster 5. Nov 2006 14:07


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:

Der Delphi-Compiler unterstützt auch das Konzept einer finalen virtuellen Methode. Durch die Anwendung des Schlüsselworts final auf eine virtuelle Methode kann verhindert werden, dass diese von einer abgeleiteten Klasse überschrieben wird. Mit diesem Schlüsselwort wird gleichzeitig dokumentiert, auf welche Weise die Klasse verwendet werden soll. Außerdem ermöglicht es dem Compiler eine Optimierung des generierten Codes.
Kann jemand ein Code-Beispiel geben, in dem eine Methode als final deklariert wird, und erklären was das bewirkt?

Hab weder hier noch auf DSDT noch bei Google ne Erklärung gefunden.

mkinzler 5. Nov 2006 14:09

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

Cöster 5. Nov 2006 14:14

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.

mkinzler 5. Nov 2006 14:16

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.

Cöster 5. Nov 2006 14:20

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?

mkinzler 5. Nov 2006 14:28

Re: Was bedeutet 'final'?
 
Ja, so verstehe ich das.

Elvis 5. Nov 2006 16:27

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.

3_of_8 5. Nov 2006 16:45

Re: Was bedeutet 'final'?
 
Auch statische Methoden können überschrieben werden, nämlich mithilfe von reintroduce.

Elvis 5. Nov 2006 17:01

Re: Was bedeutet 'final'?
 
Zitat:

Zitat von 3_of_8
Auch statische Methoden können überschrieben werden, nämlich mithilfe von reintroduce.

Nein, können sie nicht. Oder dein Begriff für die Benennung "überschreiben" geht auf Tipp-Ex zurück anstatt auf Polymorphie und virtual method slots. :mrgreen:
einfach mal ein Consolen App Project anlegen und den Code reinwerfen:
Delphi-Quellcode:
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.
Es kommt natürlich A A C raus, nicht A B C. ;)

lowpass 22. Feb 2007 15:15

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.
Seite 1 von 2  1 2      

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