Autor Beitrag
ingram333
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 11.02.10 11:41 
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:

ausblenden volle Höhe 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":
       // hier zuweisung der Methoden
       test.Save1 = new Save1(myMethod1);
   }
}

public void myMethod1()
{
    // do something
}
public void myMethod2()
{
    // do something
}
public void myMethod3()
{
    // do something
}


}


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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 11.02.10 11:49 
Hallo!

Ich glaube, was Du eher suchst, sind abstrakte Methoden. Deren Signatur wird in einer Klasse festgelegt, implementiert werden sie in einer abgeleiteten Klasse.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden volle Höhe 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)
      {   // hier zuweisung der Methoden
          case "abc": test.Saving = myMethod1; break;
          // usw. andere Methodenn
      }
   }

   public void myMethod1()
   {
      // do something
   } 
   public void myMethod2()
   {
      // do something else
   }
   public void myMethod3()
   {
       // do something
   }
}

(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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 11.02.10 14:26 
Zur Verdeutlichung:
user profile iconingram333 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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.