Außerdem würde ich mich freuen wenn mir jemand nocheinmal mit eigenen Worten den Sinn von inhirated und die genaue Funktionsweise des constructors erklären könnte. (Den constructor braucht man irgendwie um Speicher für die klasse zu reservieren und sie zu erstellen, was bedeutet dies genau? Und inherited ka wird halt manchmal auch hingeschrieben und manchmal nicht...)
Jedes Objekt (TObject) hat von Haus aus einen
constructor
.
Dieser reserviert automatisch den Speicher.
Wenn du keine weiteren Anforderungen an dein Objekt hast, dann brauchst du auch keinen speziellen
constructor
.
Delphi-Quellcode:
type
TFoo = class
public
procedure DoSomething;
end;
...
procedure TFoo.DoSomething;
begin
// some code
end;
Allerdings musst du alles, was du in der Typ-Deklaration angibst auch ausformulieren (Ausnahme bei
virtual abstract
)
inherited
bedeutet, dass hier der Code aus der Ableitung ausgeführt werden soll.
Delphi-Quellcode:
type
TFoo = class
public
InFooObject : TObject;
constructor Create;
destructor Destroy; override; // ist in TObject als virtual deklariert, darum override
end;
...
constructor TFoo.Create;
begin
inherited; // den Code der Vorgänger-Klasse - hier TObject.Create - ausführen
InFooObject := TObject.Create;
end;
destructor TFoo.Destroy;
begin
InFooObject.Free;
inherited; // den Code aus der Vorgänger-Klasse - hier TObject.Destroy - ausführen
end;
Hier mal deine Unit2 korrekt formuliert:
Delphi-Quellcode:
unit Unit2;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
TRechnen =
class( TObject )
public
// virtual - weil diese Methode in der Regel überschrieben werden soll
// abstract - weil es keine Basis-Implementierung gibt, eben halt abstrakt :o)
function CalcIt( a, b : real ) : real;
virtual;
abstract;
end;
TAddition =
class( TRechnen )
public
function CalcIt( a, b : real ) : real;
override;
end;
TSubtraktion =
class( TRechnen )
public
function CalcIt( a, b : real ) : real;
override;
end;
implementation
function TAddition.CalcIt( a, b : real ) : real;
begin
result := a + b;
end;
function TSubtraktion.CalcIt( a, b : real ) : real;
begin
result := a - b;
end;
end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)