Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Müssen abstrakte Methoden implementiert werden?


matze - Mi 20.10.10 23:08
Titel: Müssen abstrakte Methoden implementiert werden?
Hallo.

Ich habe eine Eltern-Klasse mit einer abstrakten Methode. Die davon abgeleiteten Klassen implementieren nun diese Methode, ganz wie es sein soll.
Nun kam es aber vor, dass ich (blöd wie ich bin) bei einer Klasse vergessen habe, eine abstrakte Methode auszuführen.
Der Compiler hat nicht gemeckert und das kommt mir komisch vor.
Ich weiß jetzt nicht, ob ich das mit anderen Programmiersprachen durcheinander bringe, aber ich dachte immer, abstrakte Methoden müssen in den abgeleiteten Klassen immer zwingend implementiert werden? Oder bin ich da auf dem Holzweg.

Matze


delfiphan - Mi 20.10.10 23:10

Delphi gibt nur eine Warnung aus. Zur Laufzeit gibt's beim Aufruf eine EAbstractError.


bummi - Mi 20.10.10 23:12

Knallt zur Laufzeit...


Martok - Mi 20.10.10 23:33

Also ich bekomme eine Meldung.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TAbs = class
    procedure Test; virtual;abstract;
  end;

  TDes = class(TAbs)
  end;

procedure TForm1.Button1Click(Sender: TObject);
var a: TDes;
begin
  a:= TDes.Create;
  try
    //dummy
  finally
    a.free;
  end;
end;


Quelltext
1:
[Warnung] Unit1.pas(39): Instanz von 'TDes' mit der abstrakten Methode 'TAbs.Test' wird angelegt                    


matze - Do 21.10.10 10:48

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Knallt zur Laufzeit...

Ja ganz genau. Das ist ja das Blöde.

Und ja: Stimmt, man bekommt ne Meldung, allerdings nur ne Warnung. Ich dachte, dass das dann einfach nicht kompilliert...
Und die Warnung ist blöderweise auch nicht immer zu sehen.

Danke trotzdem an alle!


Lemmy - Do 21.10.10 10:57

Hi,

hier stellt Delphi dem Entwickler wohl zu, selbst seinen Code ausreichend zu kennen. Ich glaube in C# wäre so was nicht möglich zu kompilieren.

Hier habe ich mir inzwischen angewöhnt, wenn ich eine Klasse ableite bei der Definition STRG+Leertaste zu drücken. In der Liste werden abstrakte Methode alle in roter Schrift aufgeführt, und die haue ich dann alle gleich in die Klasse rein....


matze - Do 21.10.10 11:03

Ahhh. Guter Tipp.
Danke!