Entwickler-Ecke
C# - Die Sprache - Methoden über Delegates in anderer Klasse definieren?
ingram333 - Do 11.02.10 11:41
Titel: Methoden über Delegates in anderer Klasse definieren?
Hallo zusammen,
ich habe folgendes Problem und bin mir nicht ganz sicher ob meine Vorgehensweise korrekt ist, bzw.
ob delegates überhaupt die Lösung sind.
Ich habe eine Klasse A, die drei Methoden haben soll, die ich erst bei der eigentlichen
zuweisung der anderen Klassen definiert brauche, d.h. also je nachdem wie ich die Klasse B
aufrufe, werden die Methoden in Klasse A entsprechend gesetzt (bzw. so sollte es sein).
Also vom Prinzip:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| public Class A{ public delegate int Save1(string type); public delegate int Save2(string type); public delegate int Save3(string type);
}
public Class B{ . . .
public void setMethods(string type, A test) { switch(type) { case "abc": test.Save1 = new Save1(myMethod1); } }
public void myMethod1() { } public void myMethod2() { } public void myMethod3() { }
} |
Von dort an hätte ich doch eigentlich einen Zugriff auf A.Save1, A.Save2 und A.Save3 mit den hinterlegten Methoden haben sollen, oder?
Leider kann ich nämlich die delegates nicht aus der anderen Klasse aufrufen wie z.B. eine public int Variable.
Ist der Ansatz so überhaupt richtig? Wenn ja, was könnte falsch sein?
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
JüTho - Do 11.02.10 13:44
Hallo und :welcome:
Dein Vorgehen kann noch aus einem anderen Grund nicht funktionieren.
Ein Delegate ist zunächst nur eine Klassendefinition, nämlich die Definition für eine Art von Methoden. In deiner Klasse hast du drei gleiche Delegates definiert: jeder bekommt einen String als input-Parameter und liefert einen int zurück. Tatsächlich willst du aber mit den Methoden, die in der Klasse B vorgemerkt sind, eine void-Methode ohne Parameter benutzen.
Das ginge etwa auf folgendem Wege:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| public delegate void myMethodDelegate();
public Class A { public myMethodDelegate Saving = null; }
public Class B { public void setMethods(string type, A test) { switch(type) { case "abc": test.Saving = myMethod1; break; } }
public void myMethod1() { } public void myMethod2() { } public void myMethod3() { } } |
(Ich habe ein solches Verfahren noch nicht so oft gemacht und hier nur hingeschrieben; es mag deshalb eine Reihe Ungereimtheiten enthalten. Aber das Prinzip wird hoffentlich verständlich.)
Vielleicht sind aber auch
anonyme Methoden das Stichwort. Es hängt alles davon ab, was für Spezialitäten du dir eigentlich vorstellst.
Gruß Jürgen
ingram333 - Do 11.02.10 14:20
Danke JüTho!
Genau das wollte ich :) hab anscheinend übersehen das die Delegate-Funktion ausserhalb der Klasse deklariert werden muss,
bei mir wars leider innerhalb, daher konnte ich nicht darauf zugreifen.
Klappt super jetzt, vielen Dank für die Hilfe.
JüTho - Do 11.02.10 14:26
Zur Verdeutlichung:
ingram333 hat folgendes geschrieben : |
| Genau das wollte ich :) hab anscheinend übersehen das die Delegate-Funktion ausserhalb der Klasse deklariert werden muss, |
Es handelt sich nicht um eine Funktion (bei C# sind alles Methoden), sondern
Delegate ist eine spezielle Klasse. Sie muss außerhalb von A und B deklariert werden, weil beide Klassen sie benutzen wollen.
Insofern gefallen mir die Beispiele in der SDK-Doku/MSDN/Hilfe nicht so recht, weil dort mehrere Klassen in einer Gesamtklasse verschachtelt werden, was ein relativ unübliches Mittel ist (auch wenn es in einer solchen Situation gerechtfertigt sein mag).
Gruß Jürgen
ingram333 - Do 11.02.10 14:53
DAS erklärt einiges, danke für die Hintergrundinfo. Ich ging nach lesen der Doku davon aus es ist eine spezielle Methode...
aber eine Klasse erklärt natürlich auch mein Zugriffsproblem.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!