Eine Klasse ist abstrakt, wenn sie entweder selber abstrakte Methoden deklariert oder solche von einer Elternklasse erbt, aber nicht selbst implementiert (überschreibt).
Da das Deklarieren einer abstrakten Klasse an sich nichts Verwerfliches ist, gibt der Compiler natürlich keine Warnung aus, wenn er eine solche findet. Die Warnung kommt erst dann, wenn man versucht, eine abstrakte Klasse zu instanziieren.
Delphi-Quellcode:
program AbstraktTest;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TAbstraktBasis = class(TObject) // Abstrakte Klasse, da abstrakte Methode deklariert
public
procedure Methode; virtual; abstract;
end;
TAbstraktAbgeleitet = class(TAbstraktBasis); // Abstrakte Klasse, da abstrakte Methode geerbt
TKonkretAbgeleitet = class(TAbstraktBasis) // Keine abstrakte Klasse, da Methode implementiert
public
procedure Methode; override;
end;
{ TKonkretAbgeleitet }
procedure TKonkretAbgeleitet.Methode;
begin
WriteLn('Methode wurde implementiert');
end;
{ Programmcode }
var AbstraktBasis: TAbstraktBasis;
AbstraktAbgeleitet: TAbstraktBasis;
KonkretAbgeleitet: TKonkretAbgeleitet;
begin
// Versuche, abstrakte Basisklasse zu instanziieren:
AbstraktBasis := TAbstraktBasis.Create;
// Versuche, abstrakte abgeleitete Klasse zu instanziieren:
AbstraktAbgeleitet := TAbstraktAbgeleitet.Create;
// Versuche, konkrete abgeleitete Klasse zu instanziieren:
KonkretAbgeleitet := TKonkretAbgeleitet.Create;
end.
Zitat von
Delphi 7 - Compiler:
[Warnung] AbstraktTest.dpr(36): Instanz von 'TAbstraktBasis' mit der abstrakten Methode 'TAbstraktBasis.Methode' wird angelegt
[Warnung] AbstraktTest.dpr(39): Instanz von 'TAbstraktAbgeleitet' mit der abstrakten Methode 'TAbstraktBasis.Methode' wird angelegt
Also ist die Aussage, der Compiler würde 'beim abstract-Ansatz keinen Fehler monieren', schlichtweg falsch. Oder habe ich jetzt das Thema verfehlt?