![]() |
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
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 ![]() 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; |
AW: Prüfen, ob eine Method überschriben wurde
Ja, gesehen! Danke! :wink:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 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