Герберт Шилдт - C# 4.0: полное руководство
- Название:C# 4.0: полное руководство
- Автор:
- Жанр:
- Издательство:ООО И.Д. Вильямс
- Год:2011
- Город:Москва -- Киев
- ISBN:978-5-8459-1684-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0: полное руководство краткое содержание
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.
Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
public Supplier(string n, string num) : base(n, num) { }
// ...
}
Обратите внимание на то, что в класс Friend введено свойство IsWorkNumber
, возвращающее логическое значение true, если номер телефона является рабочим.
Для управления списками телефонных номеров создадим еще один класс под названием PhoneList
. Его следует сделать обобщенным, поскольку он должен служить для управления любым списком телефонных номеров. В функции такого управления должен, в частности, входить поиск телефонных номеров по заданным именам и наоборот, поэтому на данный класс необходимо наложить ограничение по типу, требующее, чтобы объекты, сохраняемые в списке, были экземплярами класса, производного от класса PhoneNumber
.
// Класс PhoneList способен управлять любым видом списка телефонных
// номеров, при условии, что он является производным от класса PhoneNumber.
class PhoneList 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
// Имя может использоваться, потому что его свойство Name
// относится к членам класса PhoneNumber, который является
// базовым по накладываемому ограничению,
if(phList[i].Name == name) return phList[i];
}
// Имя отсутствует в списке.
throw new NotFoundException();
}
// Найти и возвратить сведения о телефоне
// по заданному номеру,
public Т FindByNumber(string number) {
for (int i=0; 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
. Кроме того, в ней создается класс EmailFriend
. Этот класс не наследует от класса 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.SerializationInfo 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 where T : PhoneNumber {
T[] phList;
int end;
Интервал:
Закладка: