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 MustOverride? (https://www.delphipraxis.net/188260-mustoverride.html)

stahli 13. Feb 2016 20:25

Delphi-Version: 5

MustOverride?
 
So ein MustOverride gibt es nicht - oder?
Delphi-Quellcode:
MyClass = class
  procedure MyMethode; virtual; mustoverride;


Der Compiler sollte somit meckern, wenn man einmal vergisst, die Methode in einer abgeleiteten Klasse zu überschreiben.
Quasi ein Abstract, aber bei jeder Vererbung.

TBx 13. Feb 2016 20:32

AW: MustOverride?
 
??? Das was Du da haben möchtest, ist doch genau der abstract. Oder stehe ich da jetzt irgendwie auf dem Schlauch?

geskill 13. Feb 2016 20:43

AW: MustOverride?
 
Ich glaube er meint, dass auch in der nächst tieferen Vererbungstiefe wieder ein override stattfinden muss.

Delphi-Quellcode:
TBaseClass = class
  procedure MyMethode; virtual; mustoverride;

TBasicClass = class(TBaseClass)
  procedure MyMethode; override; // requires override

TSpecificClass = class(TBasicClass)
  procedure MyMethode; override; // requires override
Ich wüsste nicht, dass es sowas gibt.

stahli 13. Feb 2016 20:45

AW: MustOverride?
 
Genau, was geskill schreibt.

Die zweite Ableitung wird dann nicht mehr beanstandet wenn sie die Methode nicht selbst nochmal überschreibt.
Und MustOverride könnte dennoch eine Deklaration der Basismethode ermöglichen.

TBx 13. Feb 2016 21:15

AW: MustOverride?
 
Wozu möchtest Du sowas haben? Ich kann dafür so aus dem Stehgreif keinen sinnvollen Anwendungsfall entdecken.:?:

stahli 13. Feb 2016 21:19

AW: MustOverride?
 
In meinem Fall für Aufräumaktionen für mehrere Klassen und Interfaces.
Jede Ableitung muss bestimmte Dinge beachten und daher i.d.R. die Methode überschreiben.

Natürlich BRAUCHT man das Attribut nicht. Aber es könnte bei der Fehlervermeidung helfen.

geskill 13. Feb 2016 21:43

AW: MustOverride?
 
Du konntest es vielleicht so machen:
Delphi-Quellcode:
type
  TBaseFunctions = class
    procedure MyMethode1; virtual; abstract;
    procedure MyMethode2; virtual; abstract;
  end;

  TBaseFunctionsMeta = class of TBaseFunctions;

  TBaseClass = class
    function GetFunctions: TBaseFunctionsMeta; virtual; abstract;
  end;

  //
  TBasicSpecificFunctions = class(TBaseFunctions)
    procedure MyMethode1; override;
    procedure MyMethode2; override;
  end;

  TBasicClass = class(TBaseClass)
    function GetFunctions: TBaseFunctionsMeta; override;
  end;

  //
  TSpecificSpecificFunctions = class(TBaseFunctions)
    procedure MyMethode1; override;
    procedure MyMethode2; override;
  end;

  TSpecificClass = class(TBasicClass)
    function GetFunctions: TBaseFunctionsMeta; override;
  end;
Du hast eine Klasse TBaseFunctions die bestimmte Funktionen realisiert, die jedes Mal neu definiert werden müssen.

Du erbst immer nur von TBaseFunctions.

Innerhalb der Hierarchie TBasicClass, TSpecificClass ... greifst du mittels GetFunctions auf diese Funktionen zu.

Aber auch hier musst du das override von GetFunctions sicherstellen, aber eben nur einmalig.

Jedoch müsstest du dafür existierenden Code umschreiben. Ob das so sinnvoll wäre. Ich würde lieber per Notepad++ und regulären Ausdrücken prüfen, ob ein override vorhanden ist.

stahli 13. Feb 2016 21:52

AW: MustOverride?
 
Danke für die Mühe.
Aber dann schaue ich lieber von Hand durch, ob ich die Methoden überall korrekt überschrieben habe.

Hätte ja sein können, dass ich ein passendes Attribut nicht kenne.
Die Hilfe ist ja da nicht immer eine solche.

Sir Rufo 13. Feb 2016 22:02

AW: MustOverride?
 
Ein klarer Fall für Unittests

Eine Prüfmethode kann per RTTI die deklarierten Methoden abfragen.

Allerdings reicht es auch, wenn man das korrekte Verhalten überprüft (z.B. werden alle erzeugten Instanzen auch wieder freigegeben)

Uwe Raabe 13. Feb 2016 22:27

AW: MustOverride?
 
Zitat:

Zitat von stahli (Beitrag 1330293)
In meinem Fall für Aufräumaktionen für mehrere Klassen und Interfaces.
Jede Ableitung muss bestimmte Dinge beachten und daher i.d.R. die Methode überschreiben.

Mein gängiges Muster in so einem Fall ist dies:
Delphi-Quellcode:
type
  TBaseClass = class
  private
    procedure CommonCleanup;
  protected
    procedure InternalCleanup; virtual; abstract;
  public
    procedure Cleanup;
  end;

  TDerivedClass = class(TBaseClass)
  protected
    procedure InternalCleanup; override;
  end;

procedure TBaseClass.Cleanup;
begin
  CommonCleanup;
  InternalCleanup;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz