AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MustOverride?

Ein Thema von stahli · begonnen am 13. Feb 2016 · letzter Beitrag vom 13. Feb 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#1

MustOverride?

  Alt 13. Feb 2016, 20:25
Delphi-Version: 5
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#2

AW: MustOverride?

  Alt 13. Feb 2016, 20:32
??? Das was Du da haben möchtest, ist doch genau der abstract. Oder stehe ich da jetzt irgendwie auf dem Schlauch?
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#3

AW: MustOverride?

  Alt 13. Feb 2016, 20:43
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.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: MustOverride?

  Alt 13. Feb 2016, 20:45
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#5

AW: MustOverride?

  Alt 13. Feb 2016, 21:15
Wozu möchtest Du sowas haben? Ich kann dafür so aus dem Stehgreif keinen sinnvollen Anwendungsfall entdecken.
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: MustOverride?

  Alt 13. Feb 2016, 21:19
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#7

AW: MustOverride?

  Alt 13. Feb 2016, 21:43
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.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: MustOverride?

  Alt 13. Feb 2016, 21:52
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: MustOverride?

  Alt 13. Feb 2016, 22:02
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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#10

AW: MustOverride?

  Alt 13. Feb 2016, 22:27
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr.
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