Reflection bei statischen Type-Methoden [GELÖST]

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Noa

Betreff: Reflection bei statischen Type-Methoden [GELÖST]

BeitragFr, Mai 23, 2008 8:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo allerseits,

ich hab' ein Problem, bzw. zumindest meine ich eines zu haben.
Wenn ich Reflection bei "normalen" Type-Methoden verwende funktioniert alles wunderbar, versuche ich das ganze allerdings bei einer statischen Type-Methode sieht es anders aus.
Vielleicht kann mir ja jemand helfen. Hier ein kleines Beispiel:

Code: [AUSKLAPPEN]

Type TestType
   Function Test()
      Print "doSomething"
   End Function
End Type

id:TTypeId = TTypeId.ForName("TestType")
met:TMethod = id.FindMethod("Test")

met.Invoke(Null, Null)
  • Zuletzt bearbeitet von Noa am Fr, Mai 23, 2008 9:39, insgesamt einmal bearbeitet
 

Dreamora

BeitragFr, Mai 23, 2008 9:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Method != Function
Du kannst via Method Iteration keine Functions erhalten.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Jolinah

BeitragFr, Mai 23, 2008 9:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

TMethod funktioniert nur bei normalen Methoden.

Ich finde es macht irgendwie auch keinen Sinn bei statischen Methoden. Wenn du ein Objekt von einem unbekannten Type hast, ist das natürlich sinnvoll. Aber bei statischen Methoden muss man ja sowieso den Type kennen. Dann kann man doch genau so gut einfach Type.Methode() schreiben.

Vielleicht helfen dir auch Funktionszeiger weiter?

Code: [AUSKLAPPEN]
Type TestType
   Function Test()
      Print "doSomething"
   End Function
End Type

Local MyFunc()

MyFunc = TestType.Test

If MyFunc <> Null Then MyFunc()

Noa

BeitragFr, Mai 23, 2008 9:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Dankefein ^.^
Auf den Funktions-Zeiger bin ich in dem Moment gar nicht gekommen xD
Das wird das Problem lösen.
Hintergrund der Angelegenheit ist, dass ich ein event-basiertes System aufbaue d.h. ich muss sowohl Methoden als auch Funktionen "zurückrufen" können ^^"

Nochmals danke.

Jolinah

BeitragFr, Mai 23, 2008 9:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Problem bei Funktionszeigern ist jedoch, dass sie nicht auf Instanz-Methoden zeigen können, nur auf statische Methoden und Funktionen ausserhalb von Types.

Aber man kann damit trotzdem recht gut Events realisieren Wink

Noa

BeitragFr, Mai 23, 2008 9:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Löse das so, indem ich einen Delegate-Type erstelle und für jeden speziellen Fall (Instanz, st. Funktion) einen entsprechend geerbten Typ ^^
 

Dreamora

BeitragFr, Mai 23, 2008 9:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Man nutzt auch nicht functions und methoden im wildwuchs system.
Funktionen haben kein Self, denen musst du die Type Instanz schicken. Methoden haben eine.

Von daher ist schon rein deswegen klar, das sie ganz verschiedene zwecke haben.
Bis zu 1.26 wo die Reflection rein kam, waren eventhandler nur durch Function Referenzen möglich.

Jetz lassen sich richtige Eventhandler einführen indem man den eventhandler (ein objekt mit einer Methode onXY) effektiv zuweisen kann statt irgend einen "hack around"
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Noa

BeitragFr, Mai 23, 2008 10:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nutze kein Wildwuchssystem.
Aber es hat wenig Sinn Methoden in einem Typ zu verwenden von dem keine Instanzen erzeugt werden sollen -> statischer Typ.
Mit diesen Wrapper-Methoden hab ich vorher auch gearbeitet. - Ich hab nur gehofft, dass auch statische Methoden über Reflection angesprochen werden können, wie das z.B. in Java der Fall ist.
 

Dreamora

BeitragFr, Mai 23, 2008 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, wenn du nen typ hast den du nur auf Klassen-, nicht auf Instanzebene nutzt, dann wirds vermutlich auch kein Eventhandler sein und drum auch nicht von einer abstrakten Klasse TEventHandler oder so abgeleitet, wär also wieder nen anderer Mechanismus oder?

Und BM ist nicht Java. Bis 1.26 gabs garkeine Reflection, da waren Function Pointer die einzige möglichkeit dynamische Funktionsverweise zu haben.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Noa

BeitragFr, Mai 23, 2008 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Jein, der Event-Handler registriert nur eine statische Methode als Ziel eines Ereignisses in diesem Falle. Der Event-Handler ist also quasi losgelöst von der entsprechenden Ziel-Funktion.

Wenn BMax Java wäre würde ich Java nutzen und nicht BMax, da es aber rein von den Aufrufen für die Erzeugung von Reflections fast identisch war, bin ich zumindest von der Möglichkeit ausgegangen, dass es gehen könnte und genau das wollte ich ja hier in Erfahrung bringen.
 

Dreamora

BeitragFr, Mai 23, 2008 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so, OK

Ansonsten, unter Modules - BASIC - Reflection ist das ganze in MaxIDE dokumentiert.

Wie ja oben erwähnt wurde, machts keinen Sinn das sonst was reflektiert wird, denn in BM ist reflektion nur auf Instanzebene und const, global, function sind rein auf klassenebene und erscheinen deswegen da net.
Vielleicht in einer künftigen version.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group