Использование делегатов вместо интерфейсов 


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



ЗНАЕТЕ ЛИ ВЫ?

Использование делегатов вместо интерфейсов



И делегаты, и интерфейсы позволяют конструктору классов отделять объявление типов от реализации. Определенный интерфейс может быть унаследован и реализован любым классом или структурой. Делегат может быть создан для метода в любом классе, если метод соответствует подписи метода для делегата. Ссылка на интерфейс или делегат могут быть использованы объектом, не имеющим данных о классе, реализующем интерфейс или метод делегата. Учитывая эти сходные признаки, когда в конструкторе классов следует использовать делегат, а когда следует использовать интерфейс?

Делегат следует использовать в следующих ситуациях:

· Используется шаблон разработки событий.

· Желательно инкапсулировать статический метод.

· Вызывающему не требуется доступ к другим свойствам, методам или интерфейсам объекта для реализации метода.

· Желательно простое построение.

· Классу может потребоваться несколько реализаций метода.

Интерфейс следует использовать в следующих ситуациях:

· Существует группа связанных методов, которые могут быть вызваны.

· Классу потребуется только одна реализация метода.

· Класс, использующий интерфейс, будет передавать этот интерфейс другим типам классов и интерфейсов.

· Реализуемый метод связан с типом или идентификатором класса: например, методы сравнения.

Хорошим примером использования интерфейса с одним методом вместо делегата является IComparable или более общая версия IComparable<(Of <(T>)>). В IComparable объявляется метод CompareTo, возвращающий целое число, указывающее отношение (меньше, равно или больше) между двумя объектами одинакового типа. Можно использовать IComparable в качестве основы для алгоритма сортировки. В основе алгоритма сортировки можно использовать и метод сравнения делегатов, но такой подход не является оптимальным. Возможность сравнения относится к классу, а алгоритм сравнения не изменяется при выполнении, поэтому лучше использовать интерфейс с одним методом.


Covariance and Contravariance in Delegates

Covariance and contravariance provide a degree of flexibility when you match method signatures with delegate types. Covariance permits a method to have a more derived return type than what is defined in the delegate. Contravariance permits a method with parameter types that are less derived than in the delegate type.

Example 1 (Covariance)

Description

This example demonstrates how delegates can be used with methods that have return types that are derived from the return type in the delegate signature. The data type returned by SecondHandler is of type Dogs, which derives from the Mammals type that is defined in the delegate.

Code

class Mammals { } class Dogs: Mammals { } class Program { // Define the delegate. public delegate Mammals HandlerMethod(); public static Mammals FirstHandler() { return null; } public static Dogs SecondHandler() { return null; } static void Main() { HandlerMethod handler1 = FirstHandler; // Covariance allows this delegate. HandlerMethod handler2 = SecondHandler; } }

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

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

Пример 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.

Код

ß-----



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 180; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.47.253 (0.005 с.)