![]() |
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. |
AW: MustOverride?
??? Das was Du da haben möchtest, ist doch genau der abstract. Oder stehe ich da jetzt irgendwie auf dem Schlauch?
|
AW: MustOverride?
Ich glaube er meint, dass auch in der nächst tieferen Vererbungstiefe wieder ein override stattfinden muss.
Delphi-Quellcode:
Ich wüsste nicht, dass es sowas gibt.
TBaseClass = class
procedure MyMethode; virtual; mustoverride; TBasicClass = class(TBaseClass) procedure MyMethode; override; // requires override TSpecificClass = class(TBasicClass) procedure MyMethode; override; // requires override |
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. |
AW: MustOverride?
Wozu möchtest Du sowas haben? Ich kann dafür so aus dem Stehgreif keinen sinnvollen Anwendungsfall entdecken.:?:
|
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. |
AW: MustOverride?
Du konntest es vielleicht so machen:
Delphi-Quellcode:
Du hast eine Klasse TBaseFunctions die bestimmte Funktionen realisiert, die jedes Mal neu definiert werden müssen.
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 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. |
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. |
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) |
AW: MustOverride?
Zitat:
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 07:36 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-2025 by Thomas Breitkreuz