7. Delegerare och notifierare Programmering i C# 7. Delegerare och notifierare
Delegerare Ett delegerarobjekt innehåller referenser till metoder Metoderna kan anropas via delegerarobjektet Kan användas för callback, för eventlogik, och i flera andra designlösningar Programmering i C# - Kapitel 7
7.1 Anrop via delegerare class Services // illustrerar callback-logik { public static void Sort(object CollectionToSort, SortDelegate SortTwoObjects) while (…) if(SortTwoObjects(objA, objB)) … ; } … SortTwoObjects är delegerarobjektet, associerat till någon metod Programmering i C# - Kapitel 7
Delegerartypen Delegerartypen deklareras med särskild syntax – ger klass härledd från Delegate Typen avgör vilka metoder som kan associeras Statiska, instansmetoder, samma klass, annan klass, objekt av valfri klass… delegate bool SortDelegate(object A, object B); Programmering i C# - Kapitel 7
Delegerarobjektet Objektet skapas med konstruktor som tar metodnamn som parameter! Används sedan som om det var en metod class MyCollection { public bool Compare(object o1, object o2) { … } } MyCollection coll = new MyCollection(); SortDelegate callback = new SortDelegate(coll.Compare); Services.Sort(coll, callback); Programmering i C# - Kapitel 7
Anrop till flera metoder Delegerarobjekt är egentligen samlingar av referenser till metoder Delegate.Combine konkatenerar objekt Operatorn + gör samma sak Ett anrop via delegeraren blir ett anrop till samtliga metoder Sista anropets returvärde blir delegeraranropets returvärde (därför ofta void) Programmering i C# - Kapitel 7
Publicerare och prenumeranter Annan design: delegerarobjektet som private fält i en klass En public Add-metod ger objekt av andra klasser möjlighet att lägga till referens Kallas ibland Publicerare-Prenumerant … eller event! Se kodexempel i boken! Programmering i C# - Kapitel 7
Anrop via notifierare Varför inte göra delegerarobjektet public? Prenumeranter kan då påverka varandra! Lösning: event gör enbart += och -= synligt delegate void CallEveryone(); class Publisher { public event CallEveryone call = null; … Programmering i C# - Kapitel 7
Parametrar Delegerartypen i viss mån standardiserad Klassbiblioteket erbjuder EventHandler returtyp: void parametrar: object och EventArgs Första parametern identifierar avsändaren EventArgs tänkt som basklass Används ofta som tom parameter Programmering i C# - Kapitel 7