Registriert seit: 3. Sep 2014
38 Beiträge
|
AW: Vererbung: Wie rufe ich Klasse.Parent.Methode auf?
23. Okt 2014, 16:04
Habe den Source mal angepasst. Nicht schön aber sollte gehen...
Hallo,
ich habe ein Problem mit einem Methodenaufruf.
Folgendes Szenario:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
TMutter = class(TObject)
public
procedure a(x: Boolean); virtual;
procedure b; virtual;
end;
TKind = class(TMutter)
public
procedure a(x: Boolean); override;
procedure b; override;
end;
//++++++++++++++++ inserted +++++++
TB = procedure of object;
//++++++++++++++++
procedure Log(s: string);
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure Log(s: string);
begin
Form1.Memo1.Lines.Add(s);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Mutter: TMutter;
Kind: TKind;
begin
Memo1.Lines.Clear;
Log(' ');
Log(' Mutter beinhaltet Mutter');
Mutter := TMutter.Create;
Mutter.a(True); // TMutter.a wird aufgerufen
Mutter.Free;
Log(' ');
Log(' Kind beinhaltet Kind');
Kind := TKind.Create; // TKind.a wird aufgerufen
Kind.a(True);
Kind.Free;
Log(' ');
Log(' Mutter beinhaltet Kind');
Mutter := TKind.Create;
Mutter.a(False); // TKind.a wird aufgerufen
Mutter.Free;
end;
{ TKind }
procedure TKind.a(x: Boolean);
begin
Log(' TKind.a1');
inherited;
Log(' TKind.a2');
end;
procedure TKind.b;
begin
Log(' TKind.b1');
inherited;
Log(' TKind.b2');
end;
{ TMutter }
procedure TMutter.a(x: Boolean);
// +++++++++++
var
Proc: TB;
// +++++++++++
begin
Log(' TMutter.a1');
if x then
begin
// b aufrufen. (Wenn Self = TKind ist, dann wird TKind.b aufgerufen.)
b;
end
else
begin
// Hier sollte immer TMutter.b aufgerufen werden!!!
// +++++++++++
TMethod(Proc).Code := @TMutter.b;
TMethod(Proc).Data := Self;
Proc();
// +++++++++++
// b;
end;
Log(' TMutter.a2');
end;
procedure TMutter.b;
begin
Log(' TMutter.b');
end;
end.
MaBuSE
|
|
Zitat
|