Добавить в цитаты Настройки чтения

Страница 278 из 502

<b>    throw new NotFoundException();</b>

<b>  }</b>

<b>  // Найти и возвратить сведения о телефоне</b>

<b>  // по заданному номеру,</b>

<b>  public Т FindByNumber(string number) {</b>

<b>    for (int i=0; i&lt;end; i++) {</b>

<b>      // Номер телефона также может использоваться, поскольку</b>

<b>      // его свойство Number относится к членам класса PhoneNumber,</b>

<b>      // который является базовым по накладываемому ограничению,</b>

<b>      if(phList[i].Number == number) return phList[i];</b>

<b>    }</b>

<b>    // Номер телефона отсутствует в списке,</b>

<b>    throw new NotFoundException();</b>

<b>  }</b>

<b>// ...</b>

<b>}</b>

Ограничение на базовый класс разрешает коду в классе PhoneList доступ к свойствам Name и Number для управления любым видом списка телефонных номеров. Оно гарантирует также, что для построения объекта класса PhoneList будут использоваться только доступные типы. Обратите внимание на то, что в классе PhoneList генерируется исключение NotFoundException, если имя или номер телефона не найдены. Это специальное исключение, объявляемое ниже.

<b>class NotFoundException : Exception { </b>

<b>/* Реализовать все конструкторы класса Exception. </b><b>Эти конструкторы выполняют вызов конструктора базового класса. </b><b>Класс NotFoundException ничем не дополняет класс Exception и поэтому не требует никаких дополнительных действий. */</b>

<b>public NotFoundException() : base() { }</b>

<b>public NotFoundException(string str) : base (str) { }</b>

<b>public NotFoundException(</b>

<b>         string str, Exception i

<b>protected NotFoundException(</b>

<b>    System.Runtime.Serialization.Serializationlnfo si,</b>

<b>    System.Runtime.Serialization.StreamingContext sc) : base(si, sc) { }</b>

В данном примере используется только конструктор, вызываемый по умолчанию, но ради наглядности этого примера в классе исключения NotFoundException реализуются все конструкторы, определенные в классе Exception. Обратите внимание на то, что эти конструкторы вызывают эквивалентный конструктор базового класса, определенный в классе Exception. А поскольку класс исключения NotFoundException ничем не дополняет базовый класс Exception, то для любых дополнительных действий нет никаких оснований.

В приведенной ниже программе все рассмотренные выше фрагменты кода объединяются вместе, а затем демонстрируется применение класса PhoneList. Кроме того, в ней создается класс EmailFriend. Этот класс не наследует от класса PhoneNumber, а следовательно, он не может использоваться для создания объектов класса PhoneList.

<b>// Более практический пример, демонстрирующий применение</b>

<b>// ограничения на базовый класс.</b>

<b>using System;</b>

<b>// Специальное исключение, генерируемое в том случае,</b>

<b>// если имя или номер телефона не найдены,</b>

<b>class NotFoundException : Exception {</b>

<b>  /* Реализовать все конструкторы класса Exception. Эти конструкторы выполняют вызов конструктора базового класса. Класс NotFoundException ничем не дополняет класс Exception и поэтому не требует никаких дополнительных действий. */</b>

<b>  public NotFoundException() : base() { }</b>

<b>  public NotFoundException(string str) : base(str) { }</b>

<b>  public NotFoundException(</b>

<b>        string str, Exception i

<b>  protected NotFoundException(</b>

<b>    System.Runtime.Serialization.SerializationInfo si,</b>

<b>    System.Runtime.Serialization.StreamingContext sc) : base(si, sc) { }</b>

<b>}</b>

<b>// Базовый класс, в котором хранятся имя абонента</b>

<b>// и номер его телефона,</b>

<b>class PhoneNumber {</b>

<b>  public PhoneNumber(string n, string num) {</b>

<b>    Name = n;</b>

<b>    Number = num;</b>

<b>  }</b>

<b>  public string Number { get; set; }</b>

<b>  public string Name { get; set; }</b>

<b>}</b>

<b>// Класс для телефонных номеров друзей,</b>

<b>class Friend : PhoneNumber {</b>

<b>  public Friend(string n, string num, bool wk) : base(n, num) {</b>