90 likes | 231 Views
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. 7.1 Anrop via delegerare.
E N D
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