AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Erweitern einer Klasse um eine Methode

Ein Thema von Jan · begonnen am 28. Jan 2006 · letzter Beitrag vom 28. Jan 2006
Antwort Antwort
Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#1

Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 21:43
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
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 21:45
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 21:46
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;
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von md_mse
md_mse

Registriert seit: 13. Aug 2003
Ort: Berlin
95 Beiträge
 
#4

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 22:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 22:36
...wieder was gelernt.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 22:44
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
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat
Benutzerbild von md_mse
md_mse

Registriert seit: 13. Aug 2003
Ort: Berlin
95 Beiträge
 
#7

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 22:51
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;
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 22:52
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:

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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 22:54
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von md_mse
md_mse

Registriert seit: 13. Aug 2003
Ort: Berlin
95 Beiträge
 
#10

Re: Erweitern einer Klasse um eine Methode

  Alt 28. Jan 2006, 22:55
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 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