Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Delegates

Pagina: 1
Acties:
  • 1.632 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoewel ik hier al meerdere topics over heb voorbij zien komen, met name: \[C#] Kritiek en praktische adviezen
Vind ik het toch een beetje lastige of ondoorzichtige materie. In veel voorbeelden wordt sorteren aangehaald, bijvoorbeeld: http://www.csharp-station.com/Tutorials/Lesson14.aspx
Toch begrijp ik het nog niet zo erg (waarschijnlijk omdat ik bij het gebruiken van Events er niet bij stil hoef te staan), wanneer gebruik je nou een delegate en waarom zou je een delegate verkiezen boven een implementatie adhv. interface?

  • Piels
  • Registratie: Maart 2001
  • Laatst online: 27-11 14:22
Op internet is hier genoeg over te vinden lijkt me, maar goed.

Wat snap je niet precies, want zo heel erg moeilijk is het niet.

Het is niet meer dan een function pointer.

Toevallig net een stukje code gemaakt met een delegate :)

C#:
1
2
public delegate void StatusUpdateEventHandler(string text);
public event StatusUpdateEventHandler StatusUpdateEvent;


En natuurlijk even je event registreren.

Maar wat er dus gebeurt, als het event getriggert wordt, dan wordt een functie aangeroepen die als "signature" void terug geeft en een string als input parameter heeft. Nothing more, nothing less.

[edit]
Delegates hebben niets met interfaces te maken...

[ Voor 4% gewijzigd door Piels op 27-11-2007 14:38 ]

Windows Phone Apps: Belstatus, Pinautomaten


Verwijderd

Topicstarter
Op internet is hier genoeg over te vinden lijkt me, maar goed.
Zeker, en ik weet dat delegates an sich niets met interfaces te maken hebben, maar een hoop functionaliteit valt ook te bewerkstelligen door het als interface te implementeren.

Probeer juist wat meer buiten het eventhandling verhaal te kijken, want je begrijpt dat dit
C#:
1
2
public delegate void StatusUpdateEventHandler(string text); 
public event StatusUpdateEventHandler StatusUpdateEvent;

natuurlijk geen theoretische uitleg biedt :)
Kijk, ik kan natuurlijk:
C#:
1
public delegate int Comparer(object obj1, object obj2);

Gebruiken, maar kan ook door middel van een Interface de implementatie van een Comparer method afdwingen.

Daarom mijn vraag :)

[ Voor 49% gewijzigd door Verwijderd op 27-11-2007 14:43 ]


  • Piels
  • Registratie: Maart 2001
  • Laatst online: 27-11 14:22
Ik snap je vraag niet mbt delegates / eventhandling / gebruik van interfaces...
Misschien aan de hand van een voorbeeld?

Windows Phone Apps: Belstatus, Pinautomaten


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Een interface kun je zien als een gezichts masker voor een class. Zolang het masker past maakt het niet uit of de persoon Blank, Bruin, Geel, Rood of zwart is.

Een delegate kun je zien als een plaats houder voor een methodes. Denk aan een methode VeegNeus(). Daarmee kun je verschillende manieren schrijven voor het vegen van een neus.

Op een heel erg abstract niveau zijn een delegate en interface gelijk aan elkaar. Ze beschrijven beide een programma onderdeel zonder dat ze een implementatie bevatten.

Als een event wordt afgevuurt wil je deze verwerken. Voor het programma zelf maakt het niet uit welke methode dit voor zijn rekening neemt, zolang deze maar de juiste parameters en return value heeft. Maar sorteren kan ook op verschillende manieren, dus ook hier wordt meestal een delegate gebruikt.

If it isn't broken, fix it until it is..


Verwijderd

Topicstarter
Op een heel erg abstract niveau zijn een delegate en interface gelijk aan elkaar. Ze beschrijven beide een programma onderdeel zonder dat ze een implementatie bevatten.

Als een event wordt afgevuurt wil je deze verwerken. Voor het programma zelf maakt het niet uit welke methode dit voor zijn rekening neemt, zolang deze maar de juiste parameters en return value heeft. Maar sorteren kan ook op verschillende manieren, dus ook hier wordt meestal een delegate gebruikt.
Dat begrijp ik, ik snap ook wel dat delegates type-safe functie pointers zijn en interfaces niets anders dan implementatiecontracten, maar wanneer ben je nou beter af met een delegate, gewoon concreet. Wat is het hoger doel ervan als het toch op een bepaald abstractieniveau hetzelfde is.

[ Voor 5% gewijzigd door Verwijderd op 27-11-2007 14:48 ]


  • Piels
  • Registratie: Maart 2001
  • Laatst online: 27-11 14:22
Kwestie van smaak.

Windows Phone Apps: Belstatus, Pinautomaten


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Verwijderd schreef op dinsdag 27 november 2007 @ 14:39:
[...]

Kijk, ik kan natuurlijk:
C#:
1
public delegate int Comparer(object obj1, object obj2);

Gebruiken, maar kan ook door middel van een Interface de implementatie van een Comparer method afdwingen.

Daarom mijn vraag :)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Rekenen
{
  public int TelOp(int a, int b) { return a + b; }
  public int TrekAf(int a, int b) { return a - b; }

  public delegate int Bereken(int a, int b);


  public Rekenen()
  {
      if (DateTime.Now.Seconds % 2 == 0)
        this.Bereken = TelOp;
      else
        this.Bereken = TrefAk;
  }

  public static void Main()
  {
     Rekenen rek = new Rekenen();
     rek.Bereken(1, 2); 
  }
}

Afhankelijk of het aantal seconden deelbaar is door twee gaan we optellen of aftrekken.
Een delegate is een soort variabele naar een methode.

If it isn't broken, fix it until it is..


  • FTL
  • Registratie: Maart 2000
  • Laatst online: 15:20

FTL

Ik snap zijn verwarring wel een beetje.

Stel je voor, je hebt een classe Werk die nadat hij een bepaalde actie een methode van classe Methode moet aanroepen.

Wanneer klasse Werk klasse Methode al kent (al een referentie heeft) kan hij direct op klasse Methode een functie aanroepen. De functie 'omschrijving' kan hij via een Interface vastleggen. Op deze manier kan je elk object die die interface implementeert bekend maken bij Werk en kan Werk de functie aanroepen.

Mooier is dan om de rollen om te draaien.
Classe Methode maakt bijvoorbeeld een Werk aan om iets uit te voeren en registreert een event handler bij Werk (definitie van event is de delegate, event staat in Werk). Zodra Werk klaar is kan hij kijken welke eventhandlers er zijn geregistreerd in zijn event en deze afvuren.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Aanvulling op class Rekenen:
C#:
1
2
3
4
5
6
7
8
9
public interface IRekenen
{
   int Bereken(int a, int b);
}

public class Rekenen : IRekenen
{
   ....
}

De interface beschrijft alleen dat we een methode Bereken hebben, niet de verschillende implementaties. Via de delegate kunnen we Bereken verschillende dingen laten doen.
Je kunt ook gewoon een functie van buiten de class toewijzen
rek.Bereken = MeerRekenFuncties.Delen; (statische functie)

If it isn't broken, fix it until it is..


Verwijderd

Topicstarter
Je kunt ook gewoon een functie van buiten de class toewijzen
Zolang deze maar voldoet aan de class-signature van de delegate?

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Verwijderd schreef op dinsdag 27 november 2007 @ 15:01:
[...]

Zolang deze maar voldoet aan de class-signature van de delegate?
Inderdaad. En wat die implementatie verder uitvoert is niet belangrijk (voor de delegate althans).

If it isn't broken, fix it until it is..


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:17
Verschil is met name dat je class om een delegate te implementeren niet een of andere interface hoeft te implementeren, maar een memberfunctie die voldoet aan het signature is voldoende.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1