Zum Inhalt springen
  • 0

Was sind Delegaten?


DieMstar

Frage

13 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
vor 3 Minuten schrieb KeeperOfCoffee:

Ich finde am besten kann sowas immer noch die offizielle Doc erklären. In dem Fall für VB.NET welches du ja verwendest:

https://docs.microsoft.com/de-de/dotnet/visual-basic/programming-guide/language-features/delegates/

Das ist leider genau das was ich gelesen und nicht verstanden habe ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1

In strukturierten Programmiersprachen (z.B. C) nennt man sowas auch Funktionszeiger. Ein Delegate ist ein sog. Funktionstyp.

Es gibt drei Arten von Typen. Wertetypen, wie z.B. Int, decimal, float beinhalten einen Wert. Ich schreibt hier C#-Code, da ich mit der Visual Basic-Syntax nicht ganz so vertraut bin:

int wert = 23;

Referenztypen besitzen eine Referenz zu einem Objekt:

// Definition einer Klasse
public class ClassA
{
  // Code
}

// Erzeugung einer Instanz einer Klasse
ClassA klasseA = new ClassA();

Die Variabel klasseA besitzt als Wert nun die Speicheradresse, wo das Objekt im Speicher gespeichert wurde. Darum kannst du auch nicht zwei Objekte mit dem Vergleichsoperator auf Gleichheit überprüfen. Also:

ClassA klasseA1 = new ClassA();
ClassA klasseA2 = new ClassA();

Console.WriteLine(klasseA1 == klasseA2); // Es wird false zurückgewiesen, weil die Speicheradressen unterschiedlich sind

Funktionstypen also die Delegates besitzen eine Referenz zu einer Methode. Beispiel:

public class ClassA
{
    // Defintion eines Delegates
    public delegate int Berechnung(int x, int y);

    // Funktionstyp als private Klassenvariable
    private Berechnung berechnung;
    
    // Über den Kontruktor wird das Delegate mitgegeben
    public ClassA(Berechnung berechnung)
    {
        this.berechnung = berechnung;
    }
    
    // Ausgabe des Ergebnisses des Delegates
    public void Ausgabe(int x, int y)
    {
        Console.WriteLine(this.berechnung(x, y));
    }
}

Nun kann man bei der Erzeugung der Instanz von KlasseA ein Delegate mitliefern, der beschreibt, was die Berechnung tun soll:

ClassA classA = new ClassA(Summiere);
classA.Ausgabe(10, 10);

private int Summiere(int x, int y)
{
    return x + y;
}

Da das Delegate und die Methode Summiere() die selbe Methodensignatur (die selben Parameter) aufweisen, kann ich jetzt nun die Summiere()-Methode als Delegate mitliefern. Es ist also eine Referenz auf die Methode. Wenn man jetzt nun die Ausgabe()-Methode von klasseA ausführt, wird das Delegate ausgeführt und das Delegate zeigt auf die Summiere()-Methode und dann werden beide Zahlen addiert. Auf diese Weise kann man nun das Verhalten einer Klasse bestimmen.

Ein anderes Beispiel wären die Events bei grafischen Oberflächen. Wenn du z.B. auf ein Button klickst, wird ja das OnClick()-Event aufgerufen und du kannst über das Event programmieren, was bei einem Mausklick passieren soll. Events sind auch Delegates. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Um es extrem simpel zu sagen: Delegaten sind ähnlich die Funktionszeiger (wie die Docs ja schon sagen). Sie können auf Methoden eines Objects, statischen Methoden oder anonymen Methoden verweisen. Du kannst auch dem Delegate ganze Objekte übergeben. Mir persönlich hat https://buildplease.com/pages/why-delegates/ gut geholfen zu verstehen, wie sie in der Praxis eingesetzt werden können. Du kannst halt in nem Delegate mehrere Sachen "abwickeln" und sparst dir so manchen Code immer wieder zu schreiben. Siehst du schön in den letzten zwei Codebeispielen auf der Seite.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 48 Minuten schrieb Whiz-zarD:

In strukturierten Programmiersprachen (z.B. C) nennt man sowas auch Funktionszeiger. Ein Delegate ist ein sog. Funktionstyp.

Es gibt drei Arten von Typen. Wertetypen, wie z.B. Int, decimal, float beinhalten einen Wert. Ich schreibt hier C#-Code, da ich mit der Visual Basic-Syntax nicht ganz so vertraut bin:


int wert = 23;

Referenztypen besitzen eine Referenz zu einem Objekt:


// Definition einer Klasse
public class ClassA
{
  // Code
}

// Erzeugung einer Instanz einer Klasse
ClassA klasseA = new ClassA();

Die Variabel klasseA besitzt als Wert nun die Speicheradresse, wo das Objekt im Speicher gespeichert wurde. Darum kannst du auch nicht zwei Objekte mit dem Vergleichsoperator auf Gleichheit überprüfen. Also:


ClassA klasseA1 = new ClassA();
ClassA klasseA2 = new ClassA();

Console.WriteLine(klasseA1 == klasseA2); // Es wird false zurückgewiesen, weil die Speicheradressen unterschiedlich sind

Funktionstypen also die Delegates besitzen eine Referenz zu einer Methode. Beispiel:


public class ClassA
{
    // Defintion eines Delegates
    public delegate int Berechnung(int x, int y);

    // Funktionstyp als private Klassenvariable
    private Berechnung berechnung;
    
    // Über den Kontruktor wird das Delegate mitgegeben
    public ClassA(Berechnung berechnung)
    {
        this.berechnung = berechnung;
    }
    
    // Ausgabe des Ergebnisses des Delegates
    public void Ausgabe(int x, int y)
    {
        Console.WriteLine(this.berechnung(x, y));
    }
}

Nun kann man bei der Erzeugung der Instanz von KlasseA ein Delegate mitliefern, der beschreibt, was die Berechnung tun soll:


ClassA classA = new ClassA(Summiere);
classA.Ausgabe(10, 10);

private int Summiere(int x, int y)
{
    return x + y;
}

Da das Delegate und die Methode Summiere() die selbe Methodensignatur (die selben Parameter) aufweisen, kann ich jetzt nun die Summiere()-Methode als Delegate mitliefern. Es ist also eine Referenz auf die Methode. Wenn man jetzt nun die Ausgabe()-Methode von klasseA ausführt, wird das Delegate ausgeführt und das Delegate zeigt auf die Summiere()-Methode und dann werden beide Zahlen addiert. Auf diese Weise kann man nun das Verhalten einer Klasse bestimmen.

Ein anderes Beispiel wären die Events bei grafischen Oberflächen. Wenn du z.B. auf ein Button klickst, wird ja das OnClick()-Event aufgerufen und du kannst über das Event programmieren, was bei einem Mausklick passieren soll. Events sind auch Delegates. 

Das ist ein wirklich tolles und lieb gemeintes Beispiel von dir! Und es ist wirklich schade das du dir soviel Mühe dafür gegeben hast und ich es leider immer noch nicht verstehe. Ich sehe keinen Grund Delegate zu benutzen. Ich erkenne irgendwie keinen Vorteil. Ich kann doch eine methode auch normal aufrufen ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 20 Minuten schrieb DieMstar:

Ich sehe keinen Grund Delegate zu benutzen. Ich erkenne irgendwie keinen Vorteil. Ich kann doch eine methode auch normal aufrufen 

Ich denke der Nutzen dahinter ist die Tatsache das du Funktionen/Methoden mithilfe von Delegates als Argument übergeben kannst.

Falls dir Callbacks ein Begriff sind könnte das ein gutes Beispiel für einen Anwendungsfall sein.

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor einer Stunde schrieb DieMstar:

Ich kann doch eine methode auch normal aufrufen ?

Was ist aber, wenn du nicht weißt, was aufgerufen werden soll? ;)
Das Problem hast du ja bei den Events, wenn du eine grafische Oberfläche entwickelst. Für jedes Element einer grafischen Oberfläche gibt es ja zig Events. Beispiel wäre ein ja Klick auf ein Button. Woher soll der Button jetzt nun wissen, was passieren soll? Das programmierst du nun mit Hilfe eines Delegates und weist dem Delegate eine Methode zu.

button1.Click += Button1_Click;

// ...

private void Button1_Click(object sender, EventArgs e)
{
    // Code
}

Nun weiß der Button, dass er die Methode Button1_Click() aufrufen soll, wenn das Click-Event ausgelöst wurde. 

Ohne den Delegates müsstest du eine Ableitung vom Button schreiben und dort Methoden überschreiben. Das würde dazu führen, dass du für jedes Element auf der Oberfläche eine Ableitung benötigst.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 7 Minuten schrieb Whiz-zarD:

button1.Click += Button1_Click;

Und das ist eben das Problem am Designer, da sieht man das ganze Zeug einfach nicht.

@DieMstar schau dir mal die Designer Datei an, da wirst du sehen, dass du deiner Oberfläche auf diese Art und Weise oft ein Event hinzufügst....nur...der Designer macht dies halt für dich schon.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 19 Minuten schrieb Whiz-zarD:

Was ist aber, wenn du nicht weißt, was aufgerufen werden soll? ;)
Das Problem hast du ja bei den Events, wenn du eine grafische Oberfläche entwickelst. Für jedes Element einer grafischen Oberfläche gibt es ja zig Events. Beispiel wäre ein ja Klick auf ein Button. Woher soll der Button jetzt nun wissen, was passieren soll? Das programmierst du nun mit Hilfe eines Delegates und weist dem Delegate eine Methode zu.


button1.Click += Button1_Click;

// ...

private void Button1_Click(object sender, EventArgs e)
{
    // Code
}

Nun weiß der Button, dass er die Methode Button1_Click() aufrufen soll, wenn das Click-Event ausgelöst wurde. 

Ohne den Delegates müsstest du eine Ableitung vom Button schreiben und dort Methoden überschreiben. Das würde dazu führen, dass du für jedes Element auf der Oberfläche eine Ableitung benötigst.

 

Verstehe ich Richtig, das bei einem Button mit namen "Login" 

die dazugehörige Login_Click Methode der Delegate ist?

bzw der Delegate auf Login_Click zu der ClickListenerKlasse verweist, oder irgendwie so ?

private void Login_Click(object sender, EventArgs e)
{
    // Code
}
Bearbeitet von DieMstar
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Ok vergiss was ich gesagt habe, ich war mir 100%zig sicher, dass man die Zuordnung von Click dann in der .Designer.vb sieht, aber da ist nix....hab ich wohl falsch in Erinnerung. Jedenfalls finde ichs gerade nicht in meinem Test.

Nvm in c# finde ichs

this.button1.Location = new System.Drawing.Point(559, 213);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);

aber nicht in VB...bin VB-blind

Bearbeitet von KeeperOfCoffee
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 5 Minuten schrieb KeeperOfCoffee:

Ok vergiss was ich gesagt habe, ich war mir 100%zig sicher, dass man die Zuordnung von Click dann in der .Designer.vb sieht, aber da ist nix....hab ich wohl falsch in Erinnerung. Jedenfalls finde ichs gerade nicht in meinem Test.

Ich kenne mich mit Visual Basic auch nicht aus, da ich mit C# arbeite. (Keine Ahnung, wie man heutzutage eh auf die Idee kommt, mit Visual Basic zu arbeiten) aber offenbar handhabt Visual Basic die Events ein bisschen anders. Es steht wohl direkt in der Methoden-Signatur.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

End Sub

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...