Страница 126 из 188
Для управления списками телефонных номеров создадим еще один класс под названием PhoneList. Его следует сделать обобщенным, поскольку он должен служитьдля управления любым списком телефонных номеров. В функции такого управлениядолжен, в частности, входить поиск телефонных номеров по заданным именам и наоборот, поэтому на данный класс необходимо наложить ограничение по типу, требующее, чтобы объекты, сохраняемые в списке, были экземплярами класса, производногоот класса PhoneNumber.// Класс PfconeList способен управлять любым видом списка телефонных// номеров, при условии, что он является производным от класса PhoneNumber.class PhoneList<T> where T : PhoneNumber { T[] phList; int end; public PhoneList() { phList = new T[10]; end = 0; } // Добавить элемент в список. public bool Add(T newEntry) { if(end == 10) return false; phList[end] = newEntry; end++; return true; } // Найти и возвратить сведения о телефоне по заданному имени. public Т FindByName(string name) { for(int i=0; i<end; i++) { // Имя может использоваться, потому что его свойство Name // относится к членам класса PhoneNumber, который является // базовым по накладываемому ограничению. if(phList[i].Name == name) return phList [i]; } // Имя отсутствует в списке. throw new NotFoundException(); } // Найти и возвратить сведения о телефоне по заданному номеру. public Т FindByNumber(string number) { for(int i=0; i<end; i++) { // Номер телефона также может использоваться, поскольку // его свойство Number относится к членам класса PhoneNumber, // который является базовым по накладываемому ограничению. if(phList[i].Number == number) return phList[i]; } // Номер телефона отсутствует в списке. throw new NotFoundException(); } // ...}
Ограничение на базовый класс разрешает коду в классе PhoneList доступ к свойствам Name и Number для управления любым видом списка телефонных номеров. Оногарантирует также, что для построения объекта класса PhoneList будут использоваться только доступные типы. Обратите внимание на то, что в классе PhoneList генерируется исключение NotFoundException, если имя или номер телефона не найдены.Это специальное исключение, объявляемое ниже.class NotFoundException : Exception { /* Реализовать все конструкторы класса Exception. Эти конструкторы выполняют вызов конструктора базового класса. Класс NotFoundException ничем не дополняет класс Exception и поэтому не требует никаких дополнительных действий. */ public NotFoundException() : base() { } public NotFoundException(string str) : base(str) { } public NotFoundException( string str, Exception i
В данном примере используется только конструктор, вызываемый по умолчанию,но ради наглядности этого примера в классе исключения NotFoundException реализуются все конструкторы, определенные в классе Exception. Обратите внимание нато, что эти конструкторы вызывают эквивалентный конструктор базового класса, определенный в классе Exception. А поскольку класс исключения NotFoundExceptionничем не дополняет базовый класс Exception, то для любых дополнительных действий нет никаких оснований.
В приведенной ниже программе все рассмотренные выше фрагменты кода объединяются вместе, а затем демонстрируется применение класса PhoneList. Кроме того, в ней создается класс EmailFriend. Этот класс не наследует от классаPhoneNumber, а следовательно, он не может использоваться для создания объектовкласса PhoneList.// Более практический пример, демонстрирующий применение// ограничения на базовый класс.using System;// Специальное исключение, генерируемое в том случае,// если имя или номер телефона не найдены.class NotFoundException : Exception { /* Реализовать все конструкторы класса Exception. Эти конструкторы выполняют вызов конструктора базового класса. Класс NotFoundException ничем не дополняет класс Exception и поэтому не требует никаких дополнительных действий. */ public NotFoundException() : base() { } public NotFoundException(string str) : base(str) { } public NotFoundException( string str, Exception i
Ниже приведен результат выполнения этой программы.Гари: 555-6756 (рабочий)Компания NetworkCity: 555-2564