Чтение онлайн

ЖАНРЫ

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

}

// Найти и возвратить сведения о телефоне по заданному номеру, 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 {

public PhoneNumber(string n, string num) {

Name = n;

Number = num;

}

public string Number { get; set; } public string Name { get; set; }

}

// Класс для телефонных номеров друзей, class Friend : PhoneNumber {

public Friend(string n, string num, bool wk) : base(n, num)

IsWorkNumber = wk;

}

public bool IsWorkNumber { get; private set; }

// ...

}

// Класс для телефонных номеров поставщиков, class Supplier : PhoneNumber {

public Supplier(string n, string num) : base(n, num) { }

// ...

}

// Этот класс не наследует от класса PhoneNumber. class EmailFriend {

// ...

}

// Класс PhoneList способен управлять любым видом списка телефонных номеров, // при условии, что он является производным от класса 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 ;

Поделиться с друзьями: