Delphi-Version: XE5
Prüfen, ob eine Method überschriben wurde
Hi,
folgendes Problem:
Delphi-Quellcode:
Wie kann ich das Problem lösen? Idee von C#, siehe https://stackoverflow.com/questions/...g-reflection-c.
interface
type TBaseClass = class public procedure DoSomething; virtual; abstract; constructor Create; end; type TWorkClass = class(TBaseClass) public procedure DoSomething; override; end; implementation constructor TBaseClass.Create; begin if (DoSomething wurde überschrieben) then begin DoSomething; end; end; Viele Grüße, Martin |
AW: Prüfen, ob eine Method überschriben wurde
Sieh dir mal das/die Seek vom TStream an.
Im Prinzip: Die Adresse aus der VMT auslesen und mit dem Pointern der Methode vergleichen. Oder uber die RTTI die Adresse ermitteln. |
AW: Prüfen, ob eine Method überschriben wurde
Idee:
Delphi-Quellcode:
interface
type TBaseClass = class public procedure DoSomething; virtual; abstract; constructor Create; end; type TWorkClass = class(TBaseClass) public procedure DoSomething; override; end; implementation constructor TBaseClass.Create; var Impl: procedure of object; Base: procedure of object; varClass: TClass; begin Impl := DoSomething; varClass := self.ClassType; while (varClass <> nil) AND (varClass <> TBaseClass) do varClass := varClass.ClassParent; if (varClass <> nil) then begin Base := TBaseClass(@varClass).DoSomething; if TMethod(Impl).Code <> TMethod(Base).Code then begin DoSomething; end; end; end; |
AW: Prüfen, ob eine Method überschriben wurde
Der obere Code funktioniert leider nur dann einwandfrei, wenn die Klasse tatsächlich überschrieben wurde, sonst gibt es einen abstrakten Fehler. Hab ich etwas übersehen?
|
AW: Prüfen, ob eine Method überschriben wurde
Schau dir mal die Implementierung von
Delphi-Quellcode:
an, da wird genau das gemacht ;)
TStream.Seek
|
AW: Prüfen, ob eine Method überschriben wurde
Hi,
Ja, genau aus dieser Funktion habe ich meinen oberen Code extrahiert. Habe ich etwas falsch übernommen? Habe das Gefühl, dass die Lösung wieder mal so einfach ist, dass ich den Fehler ständig übersehe... :oops: Viele Grüße, Martin |
AW: Prüfen, ob eine Method überschriben wurde
Jupp, im Original (
Delphi-Quellcode:
) ist die Methode als
TStream.Seek
Delphi-Quellcode:
und nicht als
virtual;
Delphi-Quellcode:
deklariert.
virtual; abstract;
Daher bekommst du auch den abstrakten Fehler ;) |
AW: Prüfen, ob eine Method überschriben wurde
Daher auch der zweite Absatz in #2.
|
AW: Prüfen, ob eine Method überschriben wurde
Zitat:
|
AW: Prüfen, ob eine Method überschriben wurde
Für nicht abstrakte Methoden geht in FPC mit {$mode objfpc} auch
Delphi-Quellcode:
Mit {$mode delphi} wird es zu
type
TBaseClass = class public procedure DoSomething; virtual; //abstract; //darf nicht abstract sein sonst fehlt symbol fuer linker constructor Create; end; type TWorkClass = class(TBaseClass) public procedure DoSomething; override; end; constructor TBaseClass.Create; begin if TMethod(@DoSomething).Code <> Pointer(@TBaseClass.DoSomething) then begin DoSomething(); end; end;
Delphi-Quellcode:
welches vielleicht auch in Delphi funktioniert.
type
TBaseClass = class public procedure DoSomething; virtual; //abstract; //darf nicht abstract sein sonst fehlt symbol fuer linker constructor Create; end; type TWorkClass = class(TBaseClass) public procedure DoSomething; override; end; procty = procedure() of object; constructor TBaseClass.Create; begin if TMethod(procty(DoSomething)).Code <> Pointer(@TBaseClass.DoSomething) then begin DoSomething(); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz