КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |