Autor Beitrag
relapse
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 09.12.11 14:34 
Hallo, ich habe zwei Fragen: Wie kann ich einen Delegaten (ein Verweis auf Methode der Klasse A) von der Klasse A aus einer anderen KLasse B übergeben (Im Qellcode ist die Übergabe mit ??? markiert)? Wie soll der Delegat in der Klasse B deklariert werden (Deklaration mit !!! markiert)? Klasse B kennt Klasse A nicht.
ausblenden 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:
public class A {

  public delegate void MaskeSchliessen();

  public A(Ib b){
    MaskeSchliessen maskeSchliessen;
    maskeSchliessen = new MaskeSchliessen(AnwendungSchliessen);
    Objekt objekt = new Objekt();
    b.ObjektSpeichern(objekt, ???);
  }

  public static void AnwendungSchliessen() {
    Application.Current.Shutdown();
  }

}

public interface Ib {
  void ObjektSpeichern(Objekt objekt, !!!);  // man kann ja in einem Interface keine Delegaten deklarieren!
}

public class B : Ib {
  public void ObjektSpeichern(Objekt objekt, !!!) {}
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Zuletzt bearbeitet von relapse am Fr 09.12.11 15:30, insgesamt 1-mal bearbeitet
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Fr 09.12.11 15:06 
Hallo relapse

Wenn ich dich richtig verstanden habe, sollte dieser Code funktionieren:
ausblenden 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:
    public class A
    {
        public delegate void MaskeSchliessen(); 

        public A(B b)
        { 
            MaskeSchliessen maskeSchliessen; 
            maskeSchliessen = new MaskeSchliessen(AnwendungSchliessen);
            Object objekt = new Object();
            b.ObjektSpeichern(objekt, maskeSchliessen);
        } 

        public static void AnwendungSchliessen()
        { 
            Application.Current.Shutdown(); 
        } 
    }

    public interface Ib
    { 
        public void ObjektSpeichern(Object objekt, Delegate verweis);
    } 

    public class B :Ib
    { 
        public void ObjektSpeichern(Object objekt, Delegate verweis)
        {
        } 
    }


EDIT: Sorry, mein Code hat noch einen Fehler.
In einer Schnittstelle kannst Du keinen public-Modifizierer setzen.

... ah, da warst Du schon schneller als ich. ok. :wink:

_________________
Gruss
mats74


Zuletzt bearbeitet von mats74 am Fr 09.12.11 15:27, insgesamt 2-mal bearbeitet
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 09.12.11 15:23 
Danke!!! Ich habe bis jetzt delegates nur innerhalb einer einzelnen Klasse verwendet und nicht klassenübergreifend.

Hab's direkt ausprobiert - es läuft: Der Aufruf des Delegaten erfolgt dann so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
    public class B :Ib
    { 
        public void ObjektSpeichern(Object objekt, Delegate verweis)
        {
          verweis.DynamicInvoke();
        } 
    }


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 09.12.11 16:22 
Hallo relapse :welcome:

zu
Zitat:

// man kann ja in einem Interface keine Delegaten deklarieren!


Aber außerhalb, d.h. im Namensbereich
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public delegate void SaveDelegate();

public interface Ib

    void ObjektSpeichern(Object objekt, SaveDelegate verweis);
}


P.S: Ab C# 2.0 (bzw. 3.0) solltest du Action<> bzw. Func<> (bzw. die nicht-generischen Varianten ohne Parameter) als Delegates benutzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
public interface Ib

    void ObjektSpeichern(Object objekt, Action verweis);
}

Für diesen Beitrag haben gedankt: mats74
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Fr 09.12.11 16:33 
Hallo Th69

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Aber außerhalb, d.h. im Namensbereich


Das habe ich leider übersehen.
Jetzt funktioniert der Code auch einwandfrei.
ausblenden 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:
    public delegate void MaskeSchliessen();

    public class A
    {
        public A(B b)
        {
            MaskeSchliessen maskeSchliessen;
            maskeSchliessen = new MaskeSchliessen(AnwendungSchliessen);
            Object objekt = new Object();
            b.ObjektSpeichern(objekt, maskeSchliessen);
        }

        public static void AnwendungSchliessen()
        {
            Application.Exit();
        }
    }

    public interface Ib
    {
        void ObjektSpeichern(Object objekt, Delegate verweis);
    }

    public class B : Ib
    {
        public void ObjektSpeichern(Object objekt, Delegate verweis)
        {
        }
    }

Wieder einmal was dazugelernt. :wink:

_________________
Gruss
mats74
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 09.12.11 17:09 
Hallo mats74,

auch dein Delegat-Aufruf ist sehr umständlich. Es reicht einfach:
ausblenden C#-Quelltext
1:
2:
Object objekt = new Object();
b.ObjektSpeichern(objekt, AnwendungSchliessen);
ujr
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: Mo 12.12.11 12:56 
Hallo,

warum deklarierst Du den Delegaten, wenn Du ihn gar nicht benutzt? Richtig wäre doch:

user profile iconmats74 hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
    public delegate void MaskeSchliessen();

    public interface Ib
    {
        void ObjektSpeichern(Object objekt, MaskeSchliessen verweis);
    }

    public class B : Ib
    {
        public void ObjektSpeichern(Object objekt, MaskeSchliessen verweis)
        {
           verweis();
        }
    }



Dann sparst Du auch das DynamicInvoke.
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Mo 12.12.11 17:44 
Hallo ujr

user profile iconujr hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
warum deklarierst Du den Delegaten, wenn Du ihn gar nicht benutzt? ... Dann sparst Du auch das DynamicInvoke.

Da gebe ich Dir absolut recht.
So auf die Schnelle habe ich das Beispiel ganz einfach nicht korrekt zu Ende geschrieben.
Danke Dir für deine Berichtigung.

_________________
Gruss
mats74