Zitat von
Luckie:
Zitat von
p80286:
Ich denke man könnte die abstrakte Klasse als Prototypen bezeichnen.
Ich galube, das ist eine gute Zusammenfassung.
Du kannst eine abstrakte Funtkion aber auch als "forward"-Definition ansehen.
Du hast eine Klasse TKörper, in dieser Klasse kannst Du das Gewicht berechnen in dem Du das Volumen mit dem spezifischem Gewicht des Körpers multipizierst. (Vorausgesetzt alle Körper bestehen nur aus einem Material). Der Körper weiß aber nicht wie sein Volumen berechnet wird. Ein TWürfel und eine TKugel unterscheiden sich in der Volumenberechnung.
Ich hoffe es wird Dir in folgendem Beispiel klar.
Ein anderes gutes Beispiel findest du auf Deiner Festplatte im Delphi Demos Ordner (ThreadDemo).
[edit]
Nachtrag:
Beim Kompilieren gibt es "nur" eine Warnung wenn Du abstrakte Methoden nicht implementierst.
Du kannst eine TKoerper erzeugen aber wenn Du berechneGewicht aufrufst, bekommst du beim berechneVolumen Aufruf eine
EAbstractError-
Exception.
[/edit]
Beispiel:
Delphi-Quellcode:
unit Unit2;
interface
type
TKoerper =
class
private
FspezifischesGewicht: Integer;
public
function berechneVolumen: Integer;
virtual;
abstract;
function berechneGewicht: Integer;
property spezifischesGewicht: Integer
read FspezifischesGewicht
write FspezifischesGewicht;
end;
TWuerfel =
class(TKoerper)
private
FLaenge: Integer;
public
property Laenge: Integer
read FLaenge
write FLaenge;
function berechneVolumen: Integer;
override;
end;
implementation
{ TKoerper }
function TKoerper.berechneGewicht: Integer;
begin
Result := berechneVolumen * FspezifischesGewicht;
end;
{ TWuerfel }
function TWuerfel.berechneVolumen: Integer;
begin
Result := FLaenge * FLaenge * FLaenge;
end;
end.