Ковариация и контрвариация в делегатах



Ковариация и контрвариация обеспечивают дополнительную гибкость при сравнении сигнатур методов с типами делегатов. Ковариация позволяет методу иметь тип возвращаемого значения, степень наследования которого больше, чем указано в делегате. Контрвариация использовать метод с типами параметров, степень наследования которых меньше, чем у типа делегата.

Пример 1 (ковариация)

Описание

В данном примере демонстрируется использование делегатов с методами, типы возвращаемых значений которых являются производными от типа возвращаемого значения в подписи делегата. Тип данных, возвращаемый SecondHandler, является типом Dogs, производным от заданного в делегате типа Mammals.

Код

ß------


Example 2 (Contravariance)

Description

This example demonstrates how delegates can be used with methods that have parameters of a type that are base types of the delegate signature parameter type. With contravariance, you can now use one event handler in places where, previously, you would have had to use separate handlers. For example, you can now create an event handler that accepts an EventArgs input parameter and use it with the Button.MouseClick event that sends a MouseEventArgs type as a parameter, and also with TextBox.KeyDown event that sends a KeyEventArgs parameter.

Code

System.DateTime lastActivity; public Form1() { InitializeComponent();   lastActivity = new System.DateTime(); this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs   }   // Event hander for any event with an EventArgs or // derived class in the second parameter private void MultiHandler(object sender, System.EventArgs e) { lastActivity = System.DateTime.Now; }

 


Пример 2 (контрвариация)

Описание

В данном примере демонстрируется использование делегатов с методами, параметры типа которых являются базовыми типами типа параметра сигнатуры делегата. Контрвариация позволяет использовать один обработчик событий в тех случаях, когда приходилось использовать несколько отдельных обработчиков. Например, можно создать обработчик событий, который принимает входной параметр EventArgs и использует его вместе с событием Button.MouseClick, отправляющим в качестве параметра тип MouseEventArgs, а также с событием TextBox.KeyDown, отправляющим параметр KeyEventArgs.

Код

ß-----


How to: Combine Delegates (Multicast Delegates)

This example demonstrates how to compose multicast delegates. A useful property of delegate objects is that they can be assigned to one delegate instance to be multicast using the + operator. A composed delegate calls the two delegates it was composed from. Only delegates of the same type can be composed.

The - operator can be used to remove a component delegate from a composed delegate.

Example

delegate void Del(string s); class TestClass { static void Hello(string s) {    System.Console.WriteLine(" Hello, {0}!", s); } static void Goodbye(string s) {    System.Console.WriteLine(" Goodbye, {0}!", s); } static void Main() {    Del a, b, c, d;    // Create the delegate object a that references    // the method Hello:    a = Hello;    // Create the delegate object b that references    // the method Goodbye:    b = Goodbye;    // The two delegates, a and b, are composed to form c:    c = a + b;    // Remove a from the composed delegate, leaving d,    // which calls only the method Goodbye:    d = c - a;    System.Console.WriteLine("Invoking delegate a:");    a("A");    System.Console.WriteLine("Invoking delegate b:");    b("B");    System.Console.WriteLine("Invoking delegate c:");    c("C");    System.Console.WriteLine("Invoking delegate d:");    d("D"); } }

Invoking delegate a:   Hello, A!

Invoking delegate b:   Goodbye, B!

Invoking delegate c:   Hello, C!

Goodbye, C!

Invoking delegate d:

Goodbye, D!


Объединение делегатов (многоадресные делегаты)

В этом примере демонстрируется способ компоновки многоадресных делегатов. Полезное свойство объектов делегат заключается в том, что они могут быть присвоены одному экземпляру делегата (при этом он станет многоадресным) с помощью оператора +. Составной делегат вызывает два делегата, из которых он составлен. Допускается составление делегатов только одного типа.

Оператор - служит для удаления делегата-компонента из составного делегата.

Пример

ß----


Дата добавления: 2019-03-09; просмотров: 217; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!