![]() |
Erweitern einer Klasse um eine Methode
Hallo DPler!
Ich habe folgende Frage: Ist es Möglich ein Objekt während dem erstellen um eine Methode zu erweitern? Aus Java kenne ich die Möglichkeit eine Methode innherhalb des zu erstellenden Objektes abstrakt zu lassen und dann innerhalb einer anderen Unit während dem erstellvorgang diese Methode zu implementieren. In Delphi habe ich jetzt versucht Prozeduren an den Konstruktor zu übergeben, allerdings hat das die Limitation, dass ich dann nicht auf Eigenschaften und Methoden der Klasse zugreifen kann, an die ich die Prozedur übergebe. Genau das muss ich aber können. Kann mir da jemand bei weiterhelfen? Gruß Jan |
Re: Erweitern einer Klasse um eine Methode
Wenn du in Delphi einer Klasse dynamich Methoden zuweisen willst so nimmt man da gewöhnlich Events welche dann eine Ereginisprocedure aufrufen. So wird es zum Beispiel bei Btns etc. verwendet. Ein Beispiel wäre da die OnClick Methode. Da wird dem OnClick des Buttons eine Methode zugewiesen welche dann aufgerufen wird.
|
Re: Erweitern einer Klasse um eine Methode
Du kannst bei einer Klasse eine Methode als abstrakt (oder dynamisch) deklarieren, in einer anderen Unit eine neue Klasse von dieser ableiten und dort die Methode überschreiben.
Unit1:
Delphi-Quellcode:
Unit2:
type
TMyClass=class(TObject) public procedure MyProcedure; abstract; end;
Delphi-Quellcode:
type
TMyClass2=class(TMyClass) public procedure MyProcedure; override; end; |
Re: Erweitern einer Klasse um eine Methode
Zitat:
Es ist in den meisten Fällen eher sinnvoll "virtual; abstract;" zu benutzen. |
Re: Erweitern einer Klasse um eine Methode
...wieder was gelernt.
|
Re: Erweitern einer Klasse um eine Methode
Danke erstmal für die Antworten, leider lösen beide Mein Problem nicht.
Das ganze ist etwas komplizierter. @SirThornberry: Wie ich ja schon geschrieben habe, habe ich das mit den callbacks so probiert, aber da tritt das Problem mit den Zugriffsberechtigungen auf. @3_of_8 Ja, auch das hab ich bei einigen gemacht, das Problem ist, dass es sich um eine 3D Anwendung handelt, und es gibt dort relativ viele ähnliche Objekte, die dann allerdings alle eine andere Funktion übergeben haben sollen. Man stelle sich das mal ganz grob so vor: Ich habe eine Klasse Mensch. Diese Klasse wird in meinem Programm oftmals instanziiert. Daraus resultiert, dass viele Menschen in meiner Welt umherirren. Damit diese Menschen nun aber nicht alle gleich sind, und nicht jeder gleich reagiert und gleich redet, wenn ich ihn anklicke, habe ich 3 Möglichkeiten um sie zu variieren: 1. Ich leite für jede einzelne Person die Mensch Klasse ab und verändere dort Methoden und Eigenschaften. 2. Ich ändere einfach beim instanziieren die übergebenen variabeln, um die Properties zu verändern. Diese Beiden Vorgehensweisen haben beide Nachteile und Vorteile. Die erste Methode hat den Nachteil, dass ich wirklich für jede einzelne Person in dem Programm eine neue Klasse anlegen muss, da blickt man dann als Programmierer ja gar nicht mehr durch. Sie hat allerdings auch den Vorteil, dass ich sowohl Methoden, als auch eigenschaften frei anpassen kann um diese Person zu individualisieren. Die 2. Methode hat den Vorteil, dass sie mit wenig aufwand verbunden ist, einfach die, an der Konstruktor übergebenen Variabeln ändern und fertig. Sie hat den Nachteil, dass man die Verhaltensweisen und Eigenschaften nur sehr limitiert beeinflussen kann, esseidenn man überliegert jede Menge flags und hat innerhalb der Methode unendlich viele case- und if-abfragen. Daher hatte ich gehofft man könnte das Ganze auf eine 3. Art Lösen, und zwar dem übergeben einer Methode. Da aber zum Beispiel die Methode, die zum Antworten auf Fragen zuständig ist, auf Zustandsvariabeln, wie etwa den Gemütszustand reagieren muss, habe ich ein Problem. Kann man das irgendwie deichseln? Gruß Jan |
Re: Erweitern einer Klasse um eine Methode
Ich würde es z.B. so lösen:
Delphi-Quellcode:
type
THuman = class; TSpeakMethod = procedure(HumanObject: THuman) of object; THuman = class FProp1: Integer; FProp2: Byte; FSpeakMethod: TSpeakMethod; public procedure OnSpeak; property SpeakMethod: TSpeakMethod read FSpeakMethod write FSpeakMethod; end; implementation { THuman } procedure THuman.OnSpeak; begin if (@FSpeakMethod <> nil) then FSpeakMethod(Self); end; |
Re: Erweitern einer Klasse um eine Methode
Ja: mit Events.
Delphi-Quellcode:
Dann brauchst du eine geeignete Prozedur:
type
TMensch=class(TObject) private FOnBla: TNotifyEvent; published property OnBla: TNotifyEvent read FOnInitialize write FOnInitialize; end;
Delphi-Quellcode:
In TMensch kannst du dann das Ereignis OnBla folgendermaßen auslösen:
type
TMenschEventProcedures=class public BlaMensch1: TNotifyEvent end; implementation procedure TMenschEventProcedures.BlaMensch1(Sender: TObject); begin //Tue irgendwas end;
Delphi-Quellcode:
BTW: In Delphi beginnen Klassen konventionsgemäß immer mit einem T.
if assigned(FOnBla) then FOnBla(Self);
@md_mse: Speak mit ea! ;) @Jan: So etwas wäre mit einer eigenen kleinen Scriptsprache deutlich eleganter. Hardcoding ist nicht besonders gut. |
Re: Erweitern einer Klasse um eine Methode
wie hast du es denn versucht (so das der Fehler kam)?
Ohne etwas quelltext können wir nur raten woran es lag. Oder hast du keine Methode zugeordnet? Am besten du postest einfach wie du es versucht hast. |
Re: Erweitern einer Klasse um eine Methode
Zitat:
Nein, hatte in letzter Zeit viel mit ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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 by Thomas Breitkreuz