Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Делегат и экземплярные методы

Теперь рассмотрим такой важный вопрос, как вызов экземплярных методов. Единственным отличием от обращения к статическим функциям будет способ создания делегата. Необходимо будет указать ссылку на объект, который будет использоваться при вызове метода через данный делегат.

MyDelegate del = new MyDelegate(sc.MyHandler);

Где scявляется ссылкой на экземпляр объекта, который должен использоваться при обращении к методу MyHandler.

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

Листинг 3. Использование делегата для обращения к экземплярному методу.

using System; class SomeClass{ // Поле класса. // Ни у кого не должно возникать сомнений, что оно // напрямую связано с экземпляром данного типа. public string SomeField; // Обычный метод, связанный с экземпляром типа. // Его будем вызывать при помощи делегата. public void MyHandler(string s) { // Выведем на консоль значение поля SomeField, а также // аргумент, переданный методу. Console.WriteLine(SomeField + s); }}; // Основной класс приложения.class App{ delegate void MyDelegate(string s); static void Main() { // Создадим экземпляр тестового класса. SomeClass sc = new SomeClass(); // Создадим экземпляр делегата, содержащего, // помимо ссылки на сам метод, также ссылку // на объект, для которого будет вызван метод. MyDelegate del = new MyDelegate(sc.MyHandler); // Изменяем значение поля тестового объекта. sc.SomeField = "Hello, World!"; // Вызовем метод через делегат. del(" - from Instance Delegate"); // Эквивалентен следующему вызову // sc.MyHandler(" - from Instance Delegate"); // Снова изменим значение поля тестового объекта. sc.SomeField = "Good bye, World!"; // Снова обратимся к методу. del(" - from Instance Delegate"); }};

В результате работы приложения на консоль будут выведены следующие строки.

Hello, World! - from Instance DelegateGood bye, World! - from Instance Delegate

Видно, что метод действительно был вызван от нужного объекта. Изменения, внесенные в объект после первого обращения к методу, естественно, отразились на втором обращении к нему.

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

<== предыдущая лекция | следующая лекция ==>
Создаем собственный делегат | Свойства. Этот класс является неотъемлемым в жизни любого делегата
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 490; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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