Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Erweitern einer Klasse um eine Methode (https://www.delphipraxis.net/61959-erweitern-einer-klasse-um-eine-methode.html)

Jan 28. Jan 2006 20:43


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

SirThornberry 28. Jan 2006 20:45

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.

3_of_8 28. Jan 2006 20:46

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:
type
  TMyClass=class(TObject)
  public
    procedure MyProcedure; abstract;
  end;
Unit2:
Delphi-Quellcode:
type
  TMyClass2=class(TMyClass)
  public
    procedure MyProcedure; override;
  end;

md_mse 28. Jan 2006 21:33

Re: Erweitern einer Klasse um eine Methode
 
Zitat:

Zitat von 3_of_8
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...

Es gibt kein "abstract" ohne "dynamic" oder "virtual".
Es ist in den meisten Fällen eher sinnvoll "virtual; abstract;" zu benutzen.

3_of_8 28. Jan 2006 21:36

Re: Erweitern einer Klasse um eine Methode
 
...wieder was gelernt.

Jan 28. Jan 2006 21:44

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

md_mse 28. Jan 2006 21:51

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;

3_of_8 28. Jan 2006 21:52

Re: Erweitern einer Klasse um eine Methode
 
Ja: mit Events.

Delphi-Quellcode:
type
  TMensch=class(TObject)
  private
    FOnBla: TNotifyEvent;
  published
    property OnBla: TNotifyEvent read FOnInitialize write FOnInitialize;
  end;
Dann brauchst du eine geeignete Prozedur:

Delphi-Quellcode:
type
  TMenschEventProcedures=class
  public
    BlaMensch1: TNotifyEvent
  end;

implementation

procedure TMenschEventProcedures.BlaMensch1(Sender: TObject);
begin
//Tue irgendwas
end;
In TMensch kannst du dann das Ereignis OnBla folgendermaßen auslösen:

Delphi-Quellcode:
if assigned(FOnBla) then FOnBla(Self);
BTW: In Delphi beginnen Klassen konventionsgemäß immer mit einem T.

@md_mse: Speak mit ea! ;)

@Jan: So etwas wäre mit einer eigenen kleinen Scriptsprache deutlich eleganter. Hardcoding ist nicht besonders gut.

SirThornberry 28. Jan 2006 21:54

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.

md_mse 28. Jan 2006 21:55

Re: Erweitern einer Klasse um eine Methode
 
Zitat:

Zitat von 3_of_8
@md_mse: Speak mit ea! ;)

Ups ^^... Man lernt nie aus ;)
Nein, hatte in letzter Zeit viel mit Bei Google suchenSpeex zu tun und da ist wohl zu viel hängen geblieben... Hm, gleich mal korrigieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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