Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekt funktion override (https://www.delphipraxis.net/143875-objekt-funktion-override.html)

Gruber_Hans_12345 25. Nov 2009 10:10


Objekt funktion override
 
Ich möchte gerne ZUR LAUFZEIT bei einem besteheneden Objekt eine funktion "override"

Vereifacht gesagt:

Delphi-Quellcode:
type
 TMyList = class(TList)
 private
   procedure MyClear;
 end;

procedure TMyList.MyClear;
begin
  //
end;
nun brauche ich eine Funktion, die es schaft irgendwie die MyClear als neue Clear funktion zu definiern.

Das ganze wird dann später zur Laufzeit aus einer art Interpreter generiert werden ...
Deshalb suche ich nun infos zu sowas ....

bin für alles dankbar

mkinzler 25. Nov 2009 10:12

Re: Objekt funktion override
 
Ich versthe deine Frage nicht. Könntest du dein Anliegen genauer beschreiben?

Gruber_Hans_12345 25. Nov 2009 10:18

Re: Objekt funktion override
 
Ok, ich versuche es

Ich muß zur Laufzeit eine "normale" TList erzeugen.
und für dieses eine Objekt muß ich es schaffen, das ich eine Methode, sagen wir die Clear methode überschreiben kann.
Das verhalten sollte so sein, wie wenn ich ein neuen Typ deklarieren würde.

mkinzler 25. Nov 2009 10:26

Re: Objekt funktion override
 
Das wird schwer mann könnte aber den Originaltyp mit dem abgeleiteten Typ überlagern.

himitsu 25. Nov 2009 10:28

Re: Objekt funktion override
 
Definier MyClear als VIRTUAL

und die Virtual-Method-List könnte man auch zur Laufzeit bearbeiten.


Auch wenn ich jetzt nicht verstehe, warum du das so machen willst ... könnte mir vorstellen, dß es einen anderen/besseren Weg gäbe, wenn wir wüssten, was damit erricht werden soll.

Gruber_Hans_12345 25. Nov 2009 10:31

Re: Objekt funktion override
 
Hmmm.... Ich müsste irgendwie wissen, wie Delphi intern das mit dem override macht, gibt es dafür irgendwelche Sprungtabellen, die man da bearbeiten kann?

Das Problem ist, ich weiss erst zur laufzeit, das die funktion clear "override"n werden möchte.

guinnes 25. Nov 2009 11:07

Re: Objekt funktion override
 
Zitat:

Zitat von Gruber_Hans_12345
Hmmm.... Ich müsste irgendwie wissen, wie Delphi intern das mit dem override macht, gibt es dafür irgendwelche Sprungtabellen, die man da bearbeiten kann?

Es gibt für jede Klasse eine Virtuelle Methoden Tabelle, darin stehen ( u.a. ) die Adressen der für diese Klasse gültigen Virtuellen Methoden. Da die Tabelle im Code-Segment steht, bezweifele ich, dass die beschreibbar ist

mkinzler 25. Nov 2009 11:10

Re: Objekt funktion override
 
Mir scheint diese Vorgehensweise auch nicht unbedingt optimal zu sein

DeddyH 25. Nov 2009 11:10

Re: Objekt funktion override
 
Und wenn man Clear auf jeden Fall überschreibt und bei Nichtbedarf einfach inherited Clear aufruft?

mkinzler 25. Nov 2009 11:15

Re: Objekt funktion override
 
An sowas hatt ich auch gedacht. Könnte man auch mit der Überlagerung kombinieren um diese Änderungen auf TList anzuwenden

guinnes 25. Nov 2009 11:17

Re: Objekt funktion override
 
Zitat:

Zitat von mkinzler
Mir scheint diese Vorgehensweise auch nicht unbedingt optimal zu sein

Ganz sicher nicht. Wenn er zur Laufzeit ein anderes Clear braucht, warum bearbeitet er dann die Liste nicht einfach von außen ? Ich zwar nicht OOP, aber das Überschreiben zur Laufzeit sicherlich auch nicht

Gruber_Hans_12345 25. Nov 2009 11:32

Re: Objekt funktion override
 
Das Problem ist, es handelt sich um einen interpreter, der natürlich zur laufzeit sachen erzeugt und das override von funtkionen bringe ich nicht zum laufen, da mir hier etwas der plan fehlt

so ein script sieht dann zb so aus

Delphi-Quellcode:
unit testinterpreterv3;

type
   TProzessItem = class
   private
       fTyp   : integer;
       Name   : string;
   public
       constructor Create; override;
       destructor Destroy; override;
      procedure Show;
   end;
   
   TProzessList = class(TList)
   private
       myCount    : integer;
   public
      constructor Create; override;
      destructor Destroy; override;
       procedure Clear;
      function FindByTyp(Typ : integer) : TProzessItem;
      function AddTyp(Typ : integer; Name : string) : TProzessItem;
   end;
   
constructor TProzessItem.Create;
begin
    ShowMessage('TProzessItem.Create');
end;
destructor TProzessItem.Destroy;
begin
    ShowMessage('TProzessItem.Free');
end;

constructor TProzessList.Create;
begin
    myCount := 0;
    ShowMessage('ProzessList.Create');
end;
destructor TProzessList.Destroy;
begin
    ShowMessage('ProzessList.Free');
end;
   
procedure TProzessList.Clear;
var
    i      : integer;
begin
    for i:=0 to Count-1 do Item[i].Free;
    inherited;
end;

function TProzessList.AddTyp(Typ : integer; Name : string) : TProzessItem;
begin
    Result := TProzessItem.Create;
    Result.fTyp := Typ;
    Result.Name := Name;
    Add(Result);
   
    myCount := myCount + 1;
end;
   
function TProzessList.FindByTyp(Typ : integer) : TProzessItem;
var
   i   : integer;
begin
   Result   := nil;
   for i:=0 to Count-1 do
      if Items[i].fTyp = Typ then begin
         Result   := Items[i];
         break;
      end;
end;

   
procedure TProzessItem.Show;
begin
    ShowMessage(Name);
    Name   := Name + 'test';
end;

function main : integer;
var
    x      : TProzessItem;
    x2       : TProzessItem;
    li     : TProzessList;
begin
    li     := TProzessList.Create;
    x      := li.AddTyp(1, 'test');
    li[0].Show;
    li.FindByTyp(1).Show;
   
    ShowMessage(myCount.Count);
    li.Free;
end;

end.
... und das Clear schaffe ich nicht, das er mir nun aufruft, weil ich nicht weiss ob und wie ich mich hier zwischen delphi hängen kann ...

guinnes 25. Nov 2009 11:56

Re: Objekt funktion override
 
1. Hast du es schon mal mit override versucht ?
2. Warum nimmst du keine ObjectList, da ist Clear so implementiert. ( wenn OwnsObjects True ist )

Gruber_Hans_12345 25. Nov 2009 12:12

Re: Objekt funktion override
 
Zitat:

Zitat von guinnes
1. Hast du es schon mal mit override versucht ?
2. Warum nimmst du keine ObjectList, da ist Clear so implementiert. ( wenn OwnsObjects True ist )

ja habs schon mit override probiert, nur das kennt ja leider mein interpreter noch nicht, das wollte ich ihm ja gerade beibringen ....

nicht zu vergessen, das ist ein SCRIPT was in einem INTERPRETER läuft, und kein Delphi code!!!

hoika 25. Nov 2009 12:15

Re: Objekt funktion override
 
Hallo,

Delphi-Quellcode:
for i:=0 to Count-1 do Item[i].Free;
jefährlich ...

besser

Delphi-Quellcode:
for i:= Count-1 downto 0 do Item[i].Free;
Ich hatte mir übrigens damals eine neue Methode ClearList definiert,
die im Destructor aufgerufen wurde.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz