210 likes | 370 Views
13. Delegates & events. Observer pattern Delegates Semantics Cil – kode Anvendelse Events. Observer pattern. Also called Observable in some litterature. Might also be a interface. Callback interfaces. Interfaces describes a common behavior that is shared by different classes
E N D
13. Delegates & events • Observer pattern • Delegates • Semantics • Cil – kode • Anvendelse • Events
Observer pattern Also called Observable in some litterature Might also be a interface
Callback interfaces • Interfaces describes a common behavior that is shared by different classes • Used in Observer pattern to construct a callback mecanism • The key is the Update() method in the Observer interface. • Note that it do not have to be named Update ;-) • Callback can be used in languages that supports interfaces • Callback can be implemented with function pointers in C(But then it is not by using observer pattern)
Subject (or Observable) implements an add and a remove method to add and remove observers to/from an internal container (typical an arraylist) • Has also a notify() method that calls update() on all observer object in the container • Observer implements the update() method. • That will be the event handler in an event based system
Delegate • Delegate is a new language construction in C# • Java programmers will compare it to observer pattern • C/C++, Pascal/Delphi… programmers will compare it to function pointers • A delegate gives the possibility to pass a method of a class as a parameter to objects of another class. The method can be a static or an instance method • Delegates are object oriented, typesafe and undependent of method name. • Delegates are objects itselves of classes that iniherit from System.Delegate via System.MulticastDelegate
4 steps to create and use delegates • Declare a delegate with an appropiate signature • Define method(s) with the same signature • Instansiate a delegate object with a method as parameterThe method will be encapsulated in the delegate • Call the method by the delegate
Step 1: • Declare a delegate with an appropiate signature.That means with the same parameters and return values as the method to be encapsulated delegate void Notifier(string sender);
Step 2: • Define method with the same signature as the delegate void SayHello (string sender) { Console.WriteLine("Hello from "+ sender); } void SayGoodBye (string sender) { Console.WriteLine("Good Bye from "+ sender); }
Step 3: • Instanstiate the delegate object and add the methods • Note: Static methods might be used as well. HelloGoodbye MyObject=new HelloGoodbye(); //Instanstiate delegate and thereby a container Notifier notify = new Notifier(MyObject.SayHello); //Add a new Notifier to the container (multicast); notify += new Notifier(MyObject.SayGoodBye); //For the example: remove Notifier: notify -= new Notifier(SayHello);
Trin 4: • Call the methods via the delegate: notify ("Pingo");
Demo • Incl. ildasm
Events • Delegates are often used for event based systems • The Event keyword in C# makes it little easier • The mecanism behind is the same. A event is a kind of delegate. • Events are often used in object oriented gui programs • Events can be used with advantage in other areas such as simulation and realtime systems.
Gui demo • To see the use of event handlers
Events (not gui) • Declare a delegate with an appropriate signature • Declare the events a class can send • Define event handlers (methods) • Associate event and eventhandler • Trigger event by calling event handler by the event name.
Step 1: • Declare a delegate with an appropriate signature delegate void GreetingHandler(string sender);
Trin 3: • Declare the events a class can send. • Events are members in the class they are generated from public static event GreetingHander Hello; public static event GreetingHander GoodBye;
Step 3: • Define methods with the same signature as the delegate void OnHello (string sender) { Console.WriteLine("Hello from "+ sender); } void OnGoodBye (string sender) { Console.WriteLine("Good Bye from "+ sender); }
Trin 4: • Instanstiate the delegate object and add the methods that shall be called MinKlasse.Hello+=new MinKlasse.GreetingHandler(OnHello); MinKlasse.GoodBye+=new MinKlasse.GreetingHandler(OnGoodBye); Event name in the class Delegate name in the class Event handler (method to be called)
Step 5: • Call the methods by the event name: // Somewhere in a class.. if(Hello != null) //Be sure there is an eventhandler { Hello("Pingo"); }
What is the difference between delegate and event? • Fromhttp://en.csharp-online.net/CSharp_FAQ:_What_is_the_difference_between_delegate_and_event • An event offers more restricted access than a delegate. When an event is public, other classes are only able to add or remove handlers for that event: such classes cannot—necessarily—fire the event, locate all the handlers for it, or remove handlers of which they are unaware..