Delegates & events

Download Report

Transcript Delegates & events

Delegates & events
• Observer pattern
• Delegates
– Semantics
– Cil – kode
– Anvendelse
• Events
.NET
Delegates & events
NOEA / PQC 2007
1
An example (from java!)
public class FrameMedKnap extends javax.swing.JFrame {
private javax.swing.JButton jButton1;
public FrameMedKnap() {
jButton1 = new javax.swing.JButton();
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt)
{
jButton1ActionPerformed(evt);
}
});
this.add(jButton1, java.awt.BorderLayout.CENTER);
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{
jButton1.setText("Der er trykket på knap");
}
}
.NET
Delegates & events
NOEA / PQC 2007
2
Observer pattern
Also called Observable
in some litterature
Might also be a
interface
.NET
Delegates & events
NOEA / PQC 2007
3
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)
.NET
Delegates & events
NOEA / PQC 2007
4
• 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
What is what in the
java example?
.NET
Delegates & events
NOEA / PQC 2007
5
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
.NET
Delegates & events
NOEA / PQC 2007
6
System-defined types
Object
User-defined types
String
Array
Primitive types
.NET
Boolean
Single
Byte
Double
Int16
Decimal
Int32
DateTime
Int64
TimeSpan
Char
Guid
ValueType
Exception
Delegate
Class1
Enum
Structure1
Multicast
Delegate
Class2
Delegate1
Class3
Enum1
Delegates & events
NOEA / PQC 2007
7
4 steps to create and use delegates
1. Declare a delegate with an appropiate signature
2. Define method(s) with the same signature
3. Instansiate a delegate object with a method as parameter
The method will be encapsulated in the delegate
4. Call the method by the delegate
.NET
Delegates & events
NOEA / PQC 2007
8
Step 1:
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);
.NET
Delegates & events
NOEA / PQC 2007
9
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);
}
.NET
Delegates & events
NOEA / PQC 2007
10
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);
.NET
Delegates & events
NOEA / PQC 2007
11
Trin 4:
• Call the methods via the delegate:
notify ("Pingo");
.NET
Delegates & events
NOEA / PQC 2007
12
Demo
• Incl. ildasm
.NET
Delegates & events
NOEA / PQC 2007
13
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.
.NET
Delegates & events
NOEA / PQC 2007
14
Gui demo
• To see the use of event handlers
.NET
Delegates & events
NOEA / PQC 2007
15
Events (not gui)
1.
2.
3.
4.
5.
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.
.NET
Delegates & events
NOEA / PQC 2007
16
Step 1:
1. Declare a delegate with an appropriate signature
delegate void GreetingHandler(string sender);
.NET
Delegates & events
NOEA / PQC 2007
17
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;
.NET
Delegates & events
NOEA / PQC 2007
18
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);
}
.NET
Delegates & events
NOEA / PQC 2007
19
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
.NET
Delegate
name in the
class
Delegates & events
Event handler
(method to be
called)
NOEA / PQC 2007
20
Step 5:
• Call the methods by the event name:
// Somewhere in a class..
if(Hello != null) //Be sure there is an eventhandler
{
Hello("Pingo");
}
.NET
Delegates & events
NOEA / PQC 2007
21
What is the difference between delegate and event?
• From
http://en.csharponline.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..
.NET
Delegates & events
NOEA / PQC 2007
22