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
Benutzerbild von stahli
stahli

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

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
 
#2

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.352 Beiträge
 
Delphi 11 Alexandria
 
#3

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
 
#4

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.639 Beiträge
 
Delphi 12 Athens
 
#5

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
Benutzerbild von stahli
stahli

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

AW: MustOverride?

  Alt 13. Feb 2016, 22:43
Aber wenn Du von TDerivedClass ableitest, kannst Du auch vergessen, die InternalCleanUp zu überschreiben.
Meine Frage (oder wenn mal will auch Anregung) war, dass der Compiler in dem Fall warnt.

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;

   TDerivedSubClass = class(TTDerivedClassClass)
     procedure DoSub;
   end;

procedure TBaseClass.Cleanup;
begin
   CommonCleanup;
   InternalCleanup;
end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: MustOverride?

  Alt 13. Feb 2016, 23:17
Aber wenn Du von TDerivedClass ableitest, kannst Du auch vergessen, die InternalCleanUp zu überschreiben.
Meine Frage (oder wenn mal will auch Anregung) war, dass der Compiler in dem Fall warnt.
Aber genau das tut doch der Compiler, wenn du die abgeleitete Klasse instanzierst: x1020: Instanz von '%s' mit abstrakter Methode '%s.%s' wird konstruiert (Delphi)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.395 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: MustOverride?

  Alt 13. Feb 2016, 23:21
Aber wenn Du von TDerivedClass ableitest, kannst Du auch vergessen, die InternalCleanUp zu überschreiben.
warum muss in meiner abgeleiteten Klasse die Methode die aufräumt auch unbedingt InternalCleanUp heißen?

Das aufräumen zu vergessen ist immer ein Problem - auch wenn Du ein internalCleanUp hast kannst Du eine intern initialisierte Klasse vergessen. Ich kann nicht ganz nachvollziehen wie du das vermeiden willst.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: MustOverride?

  Alt 13. Feb 2016, 23:35
@Uwe
Oh, ja, CommonCleanup ist ja nicht virtuell.
Merke ich mir mal vor. Jetzt habe ich schon von Hand aufgeräumt.

@Lemmy
Ich dachte, der Compiler kann mich direkt darauf aufmerksam machen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:22 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