[erledigt] Abgeleitete Klasse Methoden Warnung erzeugen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

[erledigt] Abgeleitete Klasse Methoden Warnung erzeugen

Beitrag von Michl »

Servus,

ich möchte gern mehrere Klassen von einer Basisklasse ableiten. Bei Methoden mit dem Zusatz "virtual abstract" bekomme ich eine schöne Warnung "project1.lpr(22,29) Warning: Constructing a class "TMyClass" with abstract method "Foo"".

Kann ich einer Methode einen anderen ähnlichen Zusatz wie "abstract" zuweisen, wenn ich bei nicht abstrakten Methoden auch so eine Warnung haben möchte. Hintergrund ist der, daß ich keine nachfolgende Methode vergessen will, zu überschreiben. Bisher füge ich mir immer händisch "Todos" ein, dies würde ich mir gern sparen.

Bsp.:

Code: Alles auswählen

program Project1;
 
type
 
  TBaseClass = class
    procedure Foo; virtual; abstract;
    procedure Bar; virtual;
  end;
 
  TMyClass = class(TBaseClass)
    // Hier fehlen beide Methoden. Eine Warnung erhalte ich für die abstrakte
    // Methode, hätte aber gern auch eine für die virtuelle Methode.
  end;
 
var
  MyClass: TMyClass;
 
procedure TBaseClass.Bar;
begin
  WriteLn('BaseClass should do some stuff');
end;
 
begin
  MyClass := TMyClass.Create;
  MyClass.Free;
end.
 
Zuletzt geändert von Michl am Mo 24. Apr 2017, 21:46, insgesamt 2-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 


Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Abgeleitete Klasse Methoden Warnung erzeugen

Beitrag von Michl »

Ja und nein. Ich wünsche mir vermutlich zu viel.

Ich möchte gern bei

Code: Alles auswählen

  TBaseClass = class
    procedure Foo; virtual; abstract;
    procedure Bar; virtual; {$Warning Overriding needed}
  end;
sobald ich diese Methode überschreibe, z.B.

Code: Alles auswählen

procedure TMyClass.Bar;
begin
  inherited Bar;
  // do some MyClass stuff
end;
daß dann die Warnung nicht mehr angezeigt wird.

Sobald ich diese Warnung in den Methodenrumpf schreiben muss, bringt mir dies keinen Vorteil mehr, da ich das jetzt schon mit den Todos mache.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Abgeleitete Klasse Methoden Warnung erzeugen

Beitrag von Mathias »

Wieso willst du keine Warnung mehr ?

Ist doch gut, das er sagt, das die Mehtode Foo in der Luft hängt. :?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Abgeleitete Klasse Methoden Warnung erzeugen

Beitrag von Jole »

Warum sollte eine Virtuelle Methode eine Warnung ausgeben? Seit wann muss den eine Virtuelle Methode zwingend überschrieben werden? Bei der Abstrakten Methode ist das klar, weil die in deiner Basisklasse noch gar nicht existiert (ist ja nur eine gedachte Methode).

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Abgeleitete Klasse Methoden Warnung erzeugen

Beitrag von Michl »

Mathias hat geschrieben:Wieso willst du keine Warnung mehr ?
Genau umgekehrt, ich hätte gern einen Warnung, wenn ich einer Methode einen Zusatz gebe. z.B.:

Code: Alles auswählen

  TBaseClass = class
    procedure Foo; virtual; abstract;
    procedure Bar; virtual; needoverride;
  end;

Jole hat geschrieben:Warum sollte eine Virtuelle Methode eine Warnung ausgeben?
Nun ich habe diverse Klassen, wie z.B. ein TEnhancedFrame (ein erweitertes TFrame) oder ein TCustomTableAccess (eine Basiszugriffsklasse auf Tabellen von Datenbanken), von denen ich immer wieder neue Klassen ableite. Funktioniert prima, allerdings nervt es mich immer wieder zu überprüfen, welche Methode "fertig" ist und welche überschrieben werden muss. Daher ist so eine Warnung sehr gut, da ich beim Kompilieren mit der Nase darauf gestoßen werde.

Jole hat geschrieben:Seit wann muss den eine Virtuelle Methode zwingend überschrieben werden?
Naja dann, wenn ich dies mir wünsche. Zum Beispiel gibt es bei dem TEnhancedFrame eine Procedure Initialize. Bei dieser würde ich gern erinnert werden, diese zu überschreiben, da der Inherited Initialize - Aufruf mal vor und mal nach bestimmter Aktionen erfolgen muss.

Aber egal, war nur eine Frage, ob es da eine Wissenslücke bei mir gibt. Ich könnte ja auch neue abstrakte Methoden mit ähnlichen Bezeichnern einfügen. Mal sehen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Abgeleitete Klasse Methoden Warnung erzeugen

Beitrag von m.fuchs »

Hm, irgendwie bist du auf dem Holzweg. Entweder die Methode muss in der abgeleiteten Klasse implementiert werden, dann muss in der Elternklasse die Methode als abstract gekennzeichnet sein. Oder die Methode ist bereits in der Elternklasse implementiert, dann muss sie auch nicht in der abgeleiteten Klasse überschrieben werden.

Wenn du Sorge hast, dass du eine Klasse erstellst die du nicht vollständig nach deinen Wünschen implementiert ist, dann solltest du dich mit dem Thema testgetriebene Entwicklung beschäftigen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Abgeleitete Klasse Methoden Warnung erzeugen

Beitrag von Michl »

m.fuchs hat geschrieben:Hm, irgendwie bist du auf dem Holzweg.
:mrgreen: nein, geht doch alles, will mir blos die Arbeit erleichtern.

m.fuchs hat geschrieben: Entweder die Methode muss in der abgeleiteten Klasse implementiert werden, dann muss in der Elternklasse die Methode als abstract gekennzeichnet sein. Oder die Methode ist bereits in der Elternklasse implementiert, dann muss sie auch nicht in der abgeleiteten Klasse überschrieben werden.
Da hast du ja Recht, allerdings überschreibst du ja sicherlich auch hier und da mal eine Methode, typisch wären z.B. Constructor/Destructor. Dafür hätte ich gern eine Warnung / Hinweis / Erinnerung für mich, daß diese nun im Regelfall überschrieben werden sollte (einfach wie ein Todo).

Danke für den Link, doch das ist imho für mein aktuelles kleines Projekt, was in einer Woche stehen soll, mit Kanonen auf Spatzen geschossen. Allerdings muss ich zugeben, daß ich den Mehraufwand dafür gar nicht einschätzen kann, da ich noch nie Unittests gemacht habe. Umgekehrt habe ich hunderte Testapps geschrieben, die bestimmte Komponenten oder Dinge testen, die mir jetzt sehr zum Vorteil gereichen, da ich dort immer wieder Dinge nachschlagen kann und mir einbilde damit jetzt Zeit zu sparen.

Wie auch immer, war nur eine Frage. Müsst nicht weiter den Kopf für mich zerbrechen. Werde den Thread als erledigt kennzeichnen.

Danke Euch allen für Eure Ideen und einen schönen Abend Euch!

Michl

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten