Страница 279 из 502
<b> IsWorkNumber = wk;</b>
<b> }</b>
<b> public bool IsWorkNumber { get; private set; }</b>
<b> // ...</b>
<b>}</b>
<b>// Класс для телефонных номеров поставщиков,</b>
<b>class Supplier : PhoneNumber {</b>
<b> public Supplier(string n, string num) : base(n, num) { }</b>
<b> // ...</b>
<b>}</b>
<b>// Этот класс не наследует от класса PhoneNumber.</b>
<b>class EmailFriend {</b>
<b> // ...</b>
<b>}</b>
<b>// Класс PhoneList способен управлять любым видом списка телефонных номеров,</b>
<b>// при условии, что он является производным от класса PhoneNumber.</b>
<b>class PhoneList<T> where T : PhoneNumber {</b>
<b> T[] phList;</b>
<b> int end;</b>
<b> public PhoneList() {</b>
<b> phList = new T[10];</b>
<b> end = 0;</b>
<b> }</b>
<b> // Добавить элемент в список,</b>
<b> public bool Add(T newEntry) {</b>
<b> if (end == 10) return false;</b>
<b> phList[end] = newEntry;</b>
<b> end++;</b>
<b> return true;</b>
<b> }</b>
<b> // Найти и возвратить сведения о телефоне по заданному имени,</b>
<b> public T FindByName(string name) {</b>
<b> for (int i = 0; i < end; i++) {</b>
<b> // Имя может использоваться, потому что его свойство Name</b>
<b> // относится к членам класса PhoneNumber, который является</b>
<b> // базовым по накладываемому ограничению,</b>
<b> if (phList[i].Name == name) return phList[i];</b>
<b> }</b>
<b> // Имя отсутствует в списке,</b>
<b> throw new NotFoundException();</b>
<b> }</b>
<b> // Найти и возвратить сведения о телефоне по заданному номеру,</b>
<b> public T FindByNumber(string number) {</b>
<b> for (int i = 0; i < 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>
<b>// Продемонстрировать наложение ограничений на базовый класс,</b>
<b>class UseBaseClassConstraint {</b>
<b> static void Main() {</b>
<b> // Следующий код вполне допустим, поскольку</b>
<b> // класс Friend наследует от класса PhoneNumber.</b>
<b> PhoneList<Friend> plist = new PhoneList<Friend>();</b>
<b> plist.Add(new Friend("Том", "555-1234", true));</b>
<b> plist.Add(new Friend("Гари", "555-6756", true));</b>
<b> plist.Add(new Friend("Матт", "555-9254", false));</b>
<b> try {</b>
<b> // Найти номер телефона по заданному имени друга.</b>
<b> Friend frnd = plist.FindByName("Гари");</b>
<b> Console.Write(frnd.Name + ": " + frnd.Number);</b>
<b> if (frnd.IsWorkNumber)</b>
<b> Console.WriteLine(" (рабочий)");</b>
<b> else</b>
<b> Console.WriteLine();</b>
<b> }</b>
<b> catch (NotFoundException) {</b>
<b> Console.WriteLine("He найдено");</b>
<b> }</b>
<b> Console.WriteLine();</b>