C# 4.0 полное руководство - 2011
Шрифт:
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; }
// ...
}
//
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 ;
// Найти и возвратить сведения о телефоне по заданному номеру, public Т FindByNumber(string number) { for(int i=0; i<end; i++) {
// Номер" телефона также может использоваться, поскольку // его свойство Number относится к членам класса PhoneNumber, // который является базовым по накладываемому ограничению, if(phList[i].Number == number) return phList[i] ;
}
// Номер телефона отсутствует в списке. • throw new NotFoundException ;
}
// ...
}
// Продемонстрировать наложение ограничений на базовый класс, class UseBaseClassConstraint { static void Main {
// Следующий код вполне допустим, поскольку // класс Friend наследует
PhoneList<Friend> plist = new PhoneList<Friend>; plist.Add(new Friend("Том", "555-1234", true)); plist.Add(new Friend("Гари", "555-6756", true)); plist.Add(new Friend("Матт", "555-9254", false));
try {
// Найти номер телефона по заданному имени друга.
Friend frnd = plist.FindByName("Гари") ;
Console.Write(frnd.Name + ": " + frnd.Number);
if(frnd.IsWorkNumber)
Console.WriteLine(" (рабочий)"); else
Console.WriteLine ;
} catch(NotFoundException) {
Console.WriteLine("He найдено");
}
Console.WriteLine;
• // Следующий код также допустим, поскольку // класс Supplier наследует от класса PhoneNumber.
PhoneList<Supplier> plist2 = new PhoneList<Supplier>; plist2.Add(new Supplier("Фирма Global Hardware", "555-8834")); plist2.Add(new Supplier ("Агентство Computer Warehouse", "555-9256")); plist2.Add(new Supplier("Компания NetworkCity", "555-2564")); try {
// Найти наименование поставщика по заданному номеру телефона. Supplier sp = plist2.FindByNumber("555-2564");
Console.WriteLine(sp.Name + ": " + sp.Number);
} catch(NotFoundException) {
Console.WriteLine("He найдено");
}
// Следующее объявление недопустимо, поскольку
// класс EmailFriend НЕ наследует от класса PhoneNumber.
// PhoneList<EmailFriend> plist3 =
// new PhoneList<EmailFriend>; // Ошибка!
}
}
Ниже приведен результат выполнения этой программы.
Гари: 555-6756 (рабочий)
Компания NetworkCity: 555-2564
Поэкспериментируйте с этой программой. В частности, попробуйте составить разные виды списков телефонных номеров или воспользоваться свойством IsWorkNumber в классе PhoneList. Вы сразу же обнаружите, что компилятор не позволит вам этого сделать, потому что свойство IsWorkNumber определено в классе Friend, а не в классе PhoneNumber, а следовательно, оно неизвестно в классе PhoneList.