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

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



Дополнительные приемы объектно-ориентированного программирования

В ЭТОЙ главе продолжается изучение языка С# и рассматриваются несколько механизмов и приемов, которые в принципе больше никуда особо не вписывались. Это вовсе не означает, что данные приемы не являются полезными, просто они не подпадают ни под какую из тех тем, которые рассматривались до этого.

В частности, в настоящей главе рассматриваются следующие основные темы.

□ Операция : : и спецификатор глобального пространства имен.

□ Специальные исключения и связанные с ними рекомендации.

□ События.

□ Анонимные методы.

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

Операция :: и спецификатор глобального пространства имен

Операция : : предоставляет альтернативный способ для получения доступа к типам в пространствах имен. Таковой может быть необходим при желании использовать псевдоним пространства имен и существовании неоднозначности между этим псевдонимом и фактической иерархией пространства имен. В таком случае иерархия пространства получает преимущество над псевдонимом. Чтобы увидеть, что это означает, рассмотрим следующий код:



using MyNamespaceAlias = MyRootNamespace.MyNestedNamespace;

namespace MyRootNamespace

namespace MyNamespaceAlias {

public class MyClass

namespace MyNestedNamespace {

public class MyClass

В коде в MyRootNamespace для ссылки на класс мог бы применяться такой синтаксис:

MyNamespaceAlias.MyClass

Классом, на который ссылается данный код, является MyRootNamespace. MyNamespace Alias .MyClass, a не MyRootNamespace .MyNestedNamespace .MyClass. To есть пространство имен MyRootNamespace .MyNamespaceAlias скрывает псевдоним, определенный в операторе using и ссылающийся на MyRootNamespace .MyNestedNamespace. Получать доступ к пространству имен MyRootNamespace .MyNestedNamespace и содержащемуся внутри него классу по-прежнему можно, но для этого требуется использовать другой синтаксис:

MyNestedNamespace.MyClass

в качестве альтернативного варианта можно применять операцию : :, как показано ниже:

MyNamespaceAlias::MyClass

Применение этой операции вынудит компилятор использовать псевдоним, определенный в операторе using и тогда код станет ссылаться на MyRootNamespace. MyNestedNamespace. MyClass.

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

global::System.Collections.Generic.List<int>

Здесь конечным классом является именно тот, который и требовался - обобщенный класс коллекции List<T>. Но классом, определенным с помощью приведенного ниже кода, он точно не является:

namespace MyRootNamespace {

namespace System {

namespace Collections {

namespace Generic {

class List<T>



Разумеется, нужно стараться не присваивать собственным пространствам имен такие имена, которые уже есть у пространств имен .NET, но такая проблема все равно может возникать в больших проектах, особенно при работе над ними в составе очень многочисленной команды. В подобных случаях применение операции : ; и ключевого слова global может быть единственным способом получения доступа к требуемым типам.

Специальные исключения

В главе 7 рассказывалось об исключения и объяснялось, как для работы с ними можно использовать блоки try. . .catch. . . finally. Еще там говорилось о нескольких стандартных исключениях .NET, а также базовом классе для всех исключений - System.Exception. Однако иногда вместо стандартных исключений бывает удобнее использовать в приложениях свои собственные классы исключений, наследуя от базового класса. Такой подход позволяет более точно задавать информацию, которая должна передаваться отвечающему за перехват исключений коду, и те исключения, которые он должен обрабатывать. Например, он позволяет добавлять в класс исключения новое свойство, обеспечивающее доступ к какой-то базовой информации, и тем самым предоставлять получателю исключения возможность вносить необходимые изменения или просто получать больше информации о причине возникновения данного исключения.

После определения класса исключения его можно добавить в список распознаваемых VS исключений, выбрав в меню Debug (Отладка) пункт Exceptions (Исключения) и выполнив в появившемся после этого окне щелчок на кнопке Add (Добавить), и затем конфигурировать его поведение так, как показывалось в главе 7.

Базовые классы исключений

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

В пространстве имен System существуют два фундаментальных и унаследованных от Exception класса исключений - ApplicationException и SystemException. Класс SystemException используется в качестве базового класса для предопределенных исключений, которые предлагаются в .NET Framework. Класс ApplicationException предназначен специально для того, чтобы разработчики могли наследовать от него свои собственные классы исключений. Если вы будете следовать этой модели, то всегда сможете отличать предопределенные и специальные исключения при перехвате исключений, унаследованных от одного из этих двух классов.

Ни класс ApplicationException, ни класс SystemException никоим образом не расширяют функциональные возможности класса Exception. Они существуют исключительно для того, чтобы позволять разработчиками различать исключения описанным выше образом.

Добавление специальных исключений в CardLib

Легче всего проиллюстрировать способы применения специальных исключений, опять-таки, на примере модернизации проекта CardLib. В настоящее время метод Deck. GetCard () в этом проекте предусматривает генерацию стандартного исключения .NET при попытке получения доступа к карте с индексом меньше О и больше 51; предлагаем изменить его теперь так, чтобы в нем использовалось специальное исключение.



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

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