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;
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);
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!!!
b;
end;
Log('
TMutter.a2');
end;
procedure TMutter.b;
begin
Log('
TMutter.b');
end;
end.
Bei
Log('Mutter beinhaltet Kind');
wird z.B. folgendes Aufgerufen:
- TKind.a (da in Mutta ja ein TKind steckt)
- TMutter.a (inherited)
- TKind.b (in TMutter.a wird das b von TKind aufgerufen, da Methode a virtual oder dynamic)
- TMutter.a (inherited)
Wie ist es möglich in TMutter.a TMutter.b aufzurufen, obwohl in TMutter ein TKind steckt?
So eine einfache Lösung wie
TMutter(Self).b
funktionieren natürlich nicht.
Hat jemand eine Idee?
Ich denke imMoment darüber nach mit den Methoden Pointer zu ermitteln und die Methode über die Adresse direkt aufzurufen. Aber das muß auch einfacher gehen.
Danke im Voraus.
MaBuSE