Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Программа 1




Практика

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

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

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

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

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

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

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

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

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

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

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

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

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

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


 

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

Задачи составлены аналогично друг другу, отличием является лишь условие поиска в массиве.

А именно:

1. Поиск заданного элемента в массиве.

2. Поиск максимального элемента в массиве.

 

using System;

//интерфейс

public interface IElement

{

void newE();

int summ();

}

//класс реализующий интерфейс

public class MyElement: IElement

{

public string name;

public int e1;

public int e2;

//метод для заполнения элементов класса

public void newE()

{

name = Console.ReadLine();

e1 = Convert.ToInt32(Console.ReadLine());

e2 = Convert.ToInt32(Console.ReadLine());

}

//подсчет суммы элементов

public int summ()

{

return (e1 + e2);

}

}

//описание делегата

delegate int Delegate1(IElement[] arr, int param);

public class Test

{//метод для поиска элемента с заданной суммой в массиве (если его нет - возвращает -1)

static int Find (IElement[] arr, int param)

{ for (int i = 1; i < 5; i ++)

{ if (arr[i].summ() == param)

{return i;} }

return -1;}

public static void Main()

{ Delegate1 d1 = new Delegate1(Find);

IElement[] array1 = new IElement[5];

array1[0] = new MyElement();

array1[0].newE();

array1[1] = new MyElement();

array1[1].newE();

array1[2] = new MyElement();

array1[2].newE();

array1[3] = new MyElement();

array1[3].newE();

array1[4] = new MyElement();

array1[4].newE();

int c = d1(array1,16);

Console.WriteLine("Номер элемента с заданной суммой:");

Console.WriteLine(c); }

}




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


Дата добавления: 2015-08-31; Просмотров: 304; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.015 сек.