AGB  ·  Datenschutz  ·  Impressum  







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

Methodpointer - wie funktioniert's?

Ein Thema von yankee · begonnen am 3. Feb 2007 · letzter Beitrag vom 4. Feb 2007
 
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
 


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 01:00 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