Шилдт Герберт
Шрифт:
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 inner) : base(str, inner) { } protected NotFoundException(
System.Runtime.Serialization.Serializationlnfo si,
System.Runtime.Serialization.StreamingContext sc) : base(si, sc) { }
В данном примере используется только конструктор, вызываемый по умолчанию, но ради наглядности этого примера в классе исключения NotFoundException реализуются все конструкторы, определенные в классе Exception. Обратите внимание на то, что эти конструкторы вызывают эквивалентный конструктор базового класса, определенный в классе.Exception. А поскольку класс исключения NotFoundException ничем не дополняет базовый класс Exception, то для любых дополнительных действий нет никаких оснований.
В приведенной ниже программе все рассмотренные выше фрагменты кода объединяются вместе, а затем демонстрируется применение класса PhoneList. Кроме того, в ней создается класс Email Friend. Этот класс не наследует от класса PhoneNumber, а следовательно, он не может использоваться для создания объектов класса PhoneList.
// Более практический пример, демонстрирующий применение // ограничения на базовый класс.
using System;
// Специальное исключение, генерируемое в том случае,
// если имя или номер телефона не найдены, class NotFoundException : Exception {
/* Реализовать все конструкторы класса Exception.
Эти конструкторы выполняют вызов конструктора базового класса.
Класс NotFoundException ничем не дополняет класс Exception и поэтому не требует никаких дополнительных действий. */
public NotFoundException base { }
public NotFoundException(string str) : base(str) { }
public NotFoundException (
string str,Exception inner) : base(str, inner) { } protected NotFoundException(
System.Runtime.Serialization.Serializationlnfо si,
System.Runtime.Serialization.StreamingContext sc) : base (si, sc) { }
}
// Базовый класс, в котором хранятся имя абонента и номер его телефона, class PhoneNumber {