Программирование >>  Программирование с использованием ajax 

1 ... 117 118 119 [ 120 ] 121 122 123 ... 396


Чтобы сделать это, первым делом создайте новый проект типа библиотеки классов по имени ChlSCardLib и, как и раньше, скопируйте в него классы из Chl2CardLib, заменив, где требуется, пространство имен Chl2CardLib на ChlSCardLib. Далее определите исключение с помощью нового класса внутри нового файла CardOutOfRangeException.CS, который можете добавить в проект ChlSCardLib, выбрав в меню Project (Проект) пункт Add Class (Добавить класс), как показано ниже:

public class CardOutOfRangeException : ApplicationException {

private Cards deckContents; public Cards DeckContents {

get {

return deckContents;

public CardOutOfRangeException(Cards sourceDeckContents) : base ( There are only 52 cards in the deck. ) В колоде имеется лишь 52 карты

deckContents = sourceDeckContents;

Экземпляр класса Cards является обязательным для конструктора данного класса. Он обеспечивает доступ к данному объекту Cards через свойство DeckContents и предоставляет подходящее сообщение об ошибке конструктору базового класса Exception, чтобы оно было доступно через его свойство Message.

Далее добавьте код для генерации специального исключения в Deck.cs (заменив им прежний код, который предназначался для выдачи стандартного исключения):

public Card GetCard(int cardNum) {

if (cardNum >= 0 && cardNum <= 51)

return cards[cardNum]; else

throw new CardOutOfRangeException (cards .Clone 0 as Cards) ;

Свойство DeckContents инициализируется после выполнения глубокого копирования текущего содержимого объекта Deck, которое имеет вид объекта Cards. Это дает возможность видеть, каким было это содержимое на момент генерации исключения, чтобы при последующем внесении изменений в содержимое колоды эта информация не утрачивалась .

Протестировать все это можно с помощью следующего клиентского кода (который также доступен и загружаемом коде для этого главы, в проекте ChiSCardCllent):

Deck deckl = new Deck();

Card myCard = deckl.GetCard(60);

catch (CardOutOfRangeException e) {

Console.WriteLine(e.Message); Console.WriteLine(e.DeckContents[0]);

}

Console.ReadKey 0;



Выполнение этого код приведет к получению вывода, показанного на рис. 13.1.


Рис. 13.1. Генерация специального исключения в проекте CardLib

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

События

В этом разделе речь пойдет об одном из наиболее часто используемых механизмов ООП в .NET, а именно - о событиях (events). Сначала, как обычно, будет приведен краткий обзор того, что собой представляют события. Далее будут показаны некоторые простые события в действии и рассказано о том, что с ними можно делать. Напоследок вы узнаете о том, как создавать и использовать свои собственные события.

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

Что собой представляет событие

События похожи на исключения тем, что они тоже генерируются, т.е. выдаются объектами, и тем, что для них тоже можно предоставлять реагирующий на них выполнением какого-нибудь действия код. Однако существует и несколько отличий, наиболее важное из которых состоит в отсутствии для обработки событий структуры, эквивалентной try. .. catch. Вместо применения этой структуры на события нужно подписываться (subscribe). Под подпиской на событие подразумевается предоставление кода, который должен выполняться при генерации данного события, в виде оаботчика событий (event handler).

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

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

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

Базовая последовательность обработки выглядит следующим образом: сначала приложение создает объект, который может генерировать событие. Например, рассмотрим приложение для мгновенного обмена сообщениями. Оно могло бы создавать объект, представляющий соединение с удаленным пользователем, и тогда этот объект мог бы генерировать событие при поступлении сообщения от удаленного пользователя по гому соединению (рис. 13.2).



Приложение

Создает

Объект, представляющий соединение

Рис. 13.2. Объект, генерирующий события

Далее приложение подписывается на событие. Приложение для мгновенного обмена сообщениями могло бы делать это путем определения функции, пригодной для использования с указанным в событии типом делегата, и передачи ссылки на эту функцию событию. Эта функция-обработчик событий могла бы представлять собой метод в другом объекте, например, объекте дисплея, и отображать мгновенные сообщения на экране по мере их поступления (рис. 13.3).

Приложение

Создает

Объект, представляющий соединение

Объект, представляющий дисплей


Подписывается на

Рис. 13.3. Подписка на событие

И, наконец, последнее: при генерации события подписчику отправляется соответствующее уведомление. Во взятом для примера приложении это означает, что при поступлении мгновенного сообщения через объект соединения в объекте, представляющем дисплей, вызывался бы метод обработчика событий. Поскольку используется стандартный метод, объект, генерирующий событие, может передавать любую имеющую отношение к делу информацию через параметры и тем самым делать события очень разнообразными. В случае взятого в качестве примера приложения одним из таких параметров мог бы быть текст мгновенного сообщения, который обработчик событий тогда бы мог отображать в объекте, представляющем дисплей, как показано на рис. 13.4.

Приложение

Объект, представляющий соединение

Генерирует событие

Объект, представляющий дисплей

Добрый день!


Вызывает

Рис. 13.4. Генерация события



1 ... 117 118 119 [ 120 ] 121 122 123 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика