[erledigt] Abgeleitete Klasse Methoden Warnung erzeugen

Für Fragen von Einsteigern und Programmieranfängern...

[erledigt] Abgeleitete Klasse Methoden Warnung erzeugen

Beitragvon Michl » 24. Apr 2017, 12:47 [erledigt] Abgeleitete Klasse Methoden Warnung erzeugen

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 24. Apr 2017, 20:46, insgesamt 2-mal geändert.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2123
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon theo » 24. Apr 2017, 13:28 Re: Abgeleitete Klasse Mathoden Warnung erzeugen

theo
 
Beiträge: 7852
Registriert: 11. Sep 2006, 18:01

Beitragvon Michl » 24. Apr 2017, 13:51 Re: Abgeleitete Klasse Methoden Warnung erzeugen

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; 
Michl
 
Beiträge: 2123
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Mathias » 24. Apr 2017, 17:19 Re: Abgeleitete Klasse Methoden Warnung erzeugen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2799
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Jole » 24. Apr 2017, 18:28 Re: Abgeleitete Klasse Methoden Warnung erzeugen

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).
Jole
 
Beiträge: 115
Registriert: 4. Jul 2014, 13:39
OS, Lazarus, FPC: Linux | 
CPU-Target: amd64
Nach oben

Beitragvon Michl » 24. Apr 2017, 19:18 Re: Abgeleitete Klasse Methoden Warnung erzeugen

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; 
Michl
 
Beiträge: 2123
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon m.fuchs » 24. Apr 2017, 19:53 Re: Abgeleitete Klasse Methoden Warnung erzeugen

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
m.fuchs
 
Beiträge: 1588
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.6, FPC 3.0) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Michl » 24. Apr 2017, 20:46 Re: Abgeleitete Klasse Methoden Warnung erzeugen

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; 
Michl
 
Beiträge: 2123
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried