Einzelnen Beitrag anzeigen

Benutzerbild von DelphiBandit
DelphiBandit

Registriert seit: 19. Feb 2007
Ort: In der Lüneburger Heide
165 Beiträge
 
Delphi 10.4 Sydney
 
#1

"Abstrakter Fehler" schon zur Compile-Zeit unterbi

  Alt 13. Nov 2009, 11:28
Hallo zusammen,

wenn ich eine Grundklasse mit abstrakten virtuellen Methoden ableite und diese dann in der erbenden Klasse nicht deklariere, bekomme ich den Fehler erst als Laufzeitfehler "Abstrakter Fehler" mitgeteilt.

Gibt es keine Möglichkeit den Compiler (hier RS 2007) zu überreden mich auf solche Unstimmigkeiten hinzuweisen? Bekomme eine Warnung vom Compiler, dass eine Instanz mit abstrakten Methoden angelegt wird. Aber keinen Compiler-Fehler. Oder ein Keyword was eine Ableitung zwingend erforderlich macht?

Andere Möglichkeit wäre der Einsatz eines Interface, dieses macht die Implementierung in den nutzenden Objekten erforderlich, aber das ist mir ein wenig viel Overhead mit der internen Zählung etc. Eigentlich nicht notwendig für meine einfachen Objekte.

Bin für jeden Tipp dankbar

Carsten

----
Beispiel (nein, aase normalerweise nicht mit globalen Var's und initialization/finalization herum - wollte mir nur weitere Events wie OnCreate sparen) -> siehe //

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TGrundklasse = class(TObject)
    private
       function FunktionEins: Boolean; virtual; abstract;
  end;

  TAbleitung = class(TGrundklasse)
    private
       function FunktionEins: Boolean; override; // Diese Zeile kommentieren -> "Abstrakter Fehler"
  end;

  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  tobj: TAbleitung;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
   tobj.FunktionEins;
end;

{ TAbleitung }
// Hier auch kommentieren
function TAbleitung.FunktionEins: Boolean;
begin
  MessageDlg('Funktion ist deklariert und funktioniert', mtInformation, [mbOK], 0);
  Result := True;
end;

initialization
  tobj := TAbleitung.Create;

finalization
  tobj.Free;

end.
Carsten
  Mit Zitat antworten Zitat