Namespace ClassDemo

Члены классов

Remove

Public class PlayerUI

{ // Определить событие для уведомления о воспроизведении.

private EventHandler<PlayEventArgs> playEvent;

public event EventHandler<PlayEventArgs> PlayEvent

{ add

{ playEvent = (EventHandler<PlayEventArgs>)

Delegate.Combine(playEvent, value);

}

{ playEvent = (EventHandler<PlayEventArgs>)

Delegate.Remove(playEvent, value);

}

}

public void UserPressedPlay()

{ OnPlay();

}

protected virtual void OnPlay()

{ // Инициировать событие.

EventHandler<PlayEventArgs> localHandler = playEvent;

if (localHandler!= null)

{ localHandler(this, new PlayEventArgs("somefile.wav"));

}

}

}

Внутри разделов add и remove объявления события ссылка на добавляемый или удаляемый делегат осуществляется по ключевому слову value, что идентично тому, как работает метод set свойства. Данный пример использует Delegate.Combine и Delegate.Remove для управления внутренней цепочкой делегатов по имени playEvent. Пример выглядит несколько надуманным, поскольку механизм событий по умолчанию делает, по сути, то же самое, однако он предназначен только для целей демонстрации.

На заметку! Явное определение пользовательских средств доступа к событиям может потребоваться для построения специализированного механизма хранения событий или для выполнения специальной обработки при регистрации и отмене регистрации событий.

А теперь заключительный комментарий относительно шаблонов проектирования. На основе сказанного можно сделать вывод, что события идеальны для реализации шаблона проектирования "издатель/подписчик", когда множество слушателей регистрируются для получения уведомления о событии (о его публикации). Точно так же события.NET удобно использовать для реализации формы шаблона Observer (Обозреватель), когда некоторые сущности регистрируются для получения уведомлений об изменении другой сущности. Это лишь два шаблона проектирования, реализацию которых облегчают события.

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

Пример 14.3.

using System;

{ public class Human

{ private string HumanName = ""; // Определение поля Имя

private short HumanAge = 0; // Определение поля Возраст

// Объявление событий (2-стр.82), уведомляющих о смене имени и возраста

// public event NameChangedEventHandler NameChanged(string NewNameValue);

// public event AgeChangedEventHandler AgeChanged(short NewAgeValue);

public string Name // Определение свойства Имя

{ get

{ return HumanName; // Возврат значения, хранимого в поле

}

set //(string Value)

{ HumanName = value; // Сохранение значения в поле

// Рассылка события смены имени

// NameChanged(HumanName);

}

}

public short Age // Определение свойства Возраст

{ get

{ return HumanAge; // Возврат значения, хранимого в поле

}

set //(short Value)

{ if (value < 0 | value > 200)

{ // Вывод сообщения об ошибке изменения возраста

Console.WriteLine("Возраст должен быть между " +

"0 и 200 годами.");

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: