Delphi-PRAXiS

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?

Phoenix 22. Feb 2007 15:21

Re: Was bedeutet 'final'?
 
Zeig doch erst mal, was bei Dir nicht geht :)

lowpass 22. Feb 2007 15:31

Re: Was bedeutet 'final'?
 
Zitat:

Zitat von Phoenix
Zeig doch erst mal, was bei Dir nicht geht :)

Folgende Ausgangslage:
Delphi-Quellcode:
TOberklasse = class
    function getIt: String;virtual;
end;

TUnterklasse = class(TOberklasse)
    function getIt: String;override;
end;
Und wo kommt jetzt das "final" hin?

Phoenix 22. Feb 2007 15:44

Re: Was bedeutet 'final'?
 
Zitat:

Zitat von lowpass
Und wo kommt jetzt das "final" hin?

Dahin:
Delphi-Quellcode:
TUnterklasse = class(TOberklasse)
   function getIt: String; override; final;
end;

yörsch 22. Feb 2007 15:48

Re: Was bedeutet 'final'?
 
Zitat:

Zitat von lowpass
Und wo kommt jetzt das "final" hin?

ich kriegs auch nicht hin :wall:
und arbeite mit Delphi 7 Architect Build 4.453 in der Hilfe gibts nix über final???
ab welcher version gibt´s das :gruebel:

Robert Marquardt 22. Feb 2007 15:52

Re: Was bedeutet 'final'?
 
Gerade mit meinem Turbo Delphi getestet:
Delphi-Quellcode:
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;
Das gibt keine Fehlermeldung.
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.

yörsch 22. Feb 2007 15:59

Re: Was bedeutet 'final'?
 
Zitat:

Zitat von Robert Marquardt
final ist bestimmt nicht vor D8 implementiert. Das stammt vermutlich von den fuer .net noetigen Erweiterungen der Sprache.

OK das erklärt einiges...
somit ist wohl auch das Problem von Cöster erklärt... :wink:

lowpass 23. Feb 2007 09:15

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