Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: Methodpointer - wie funktioniert's?

  Alt 3. Feb 2007, 16:07
Zitat von yankee:
Ich habe mir einen kleinen Matheparser gebastelt. Der soll natürlich auch Funktionen wie sinus usw. aufrufen können. Also muss ich einem String eine Funktion zuordnen.
Das mache ich mit dem Dictionary, welches ich unter dem Titel "Hash-tabellen" in der Code-lib gefunden habe . Dadrin speicher ich dann immer einen Pointer auf die zugehörige Funktion.
Da würde ich Dir dann auch gleich zu einem anderen Weg raten. Da Du eh Methoden verwendest, kannst Du gleich einen Ansatz wählen, der ein wenig mehr OOP ist. Die Umsetzung ist sehr elegant mit dem Command-Pattern (hoffe ich irre mich gerade nicht was den Namen angeht) möglich.
Die Idee ist einfach und häufig nötig, da viele moderne Sprachen auf explizite Zeiger (zum Glück) verzichten. Die einfache Idee besteht darin, dass Du statt einem Methodenzeiger einfach eine abstrakte Klasse oder ein Interface erstellst, dass die Methode die Du aufrufen möchtest enthält. Diese Methode ist dabei abstrakt (also noch nicht implementiert).
Für jede Methode die Du aufrufen möchtest erstellst Du dann einfach eine Klasse, die von der abstrakten Klasse erbt bzw. das entsprechende Interface implementiert.
Da wo die Methoden aufgerufen werden, brauchst Du nur noch eine Instanz der abstrakten Klasse oder des Interface. Was hier wirklich hinter steckt kann Dir egal sein, der Aufruf der Methode führt natürlich zum Aufruf der tatsächlichen Implementierung.

Delphi-Quellcode:
type
  IBase = interface
    procedure doFoo(const arg: String); // implizit abstract und public
  end;

  TFoo = class(TInterfacedObject, IBase)
    public
      procedure doFoo(const arg: String);
  end;

  TBar = class(TInterfaceObject, IBase)
    public
      procedure doFOo(const arg: String);
  end;

....
Hier hättest Du jetzt zwei verschidene Implementierungen des Interfaces. Nun kannst Du einfach für jede Klasse jeweils eine Instanz erzeugen und in deiner Map speichern. Für jeden String, den Du parst, holst Du dir dann aus der Map einfach ein Interface, von dem Du weißt das Du es in ein IBase-Interface casten und die Methode doFoo aufrufen kannst.
Ok, glaube die Maps arbeiten lieber mit Objekten zusammen, da würde sich eventuelle doch eine abstrakte Klasse besser machen.

Ich hoffe jedenfalls, dass die Idee grob klar ist. Entspricht einfach nur der OOP-Variante eines Methodenzeigers (die Idee ist natürlich komplett die gleiche)
  Mit Zitat antworten Zitat