Герберт Шилдт - 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: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Обратите также внимание на то, что в классе Gen2
параметр типа Т не используется, а только передается вверх по иерархии базовому классу Gen
. Это означает, что в производном классе следует непременно указывать параметры типа, требующиеся его обобщенному базовому классу, даже если этот производный класс не обязательно должен быть обобщенным.
Разумеется, в производный класс можно свободно добавлять его собственные параметры типа, если в этом есть потребность. В качестве примера ниже приведен вариант предыдущей иерархии классов, где в класс Gen2
добавлен собственный параметр типа.
// Пример добавления собственных параметров типа в производный класс,
using System;
// Обобщенный базовый класс,
class Gen {
T ob; // объявить переменную типа Т
// Передать конструктору ссылку типа Т.
public Gen(T о) {
ob = о;
}
// Возвратить значение переменной ob.
public T GetOb() {
return ob;
}
}
// Класс, производный от класса Gen. В этом классе
// определяется второй параметр типа V.
class Gen2 : Gen {
V ob2;
public Gen2(T o, V o2) : base(o) {
ob2 = o2;
}
public V GetObj2() {
return ob2;
}
}
// Создать объект класса Gen2.
class GenHierDemo2 {
static void Main() {
// Создать объект класса Gen2 с параметрами
// типа string и int.
Gen2 < string, int > x =
new Gen2("Значение равно: ", 99);
Console.Write(x.GetOb());
Console.WriteLine(x.GetObj2());
}
}
Обратите внимание на приведенное ниже объявление класса Gen2 в данном варианте иерархии классов.
class Gen2 : Gen {
В этом объявлении Т — это тип, передаваемый базовому классу Gen
; а V — тип, характерный только для производного класса Gen2
. Он служит для объявления объекта оb2
и в качестве типа, возвращаемого методом GetObj2()
. В методе Main()
создается объект класса Gen2
с параметром Т типа string
и параметром V типа int. Поэтому код из приведенного выше примера дает следующий результат.
Значение равно: 99
Необобщенный класс может быть вполне.законно базовым для обобщенного производного класса. В качестве примера рассмотрим следующую программу.
// Пример необобщенного класса в качестве базового для
// обобщенного производного класса.
using System;
// Необобщенный базовый класс,
class NonGen {
int num;
public NonGen(int i) {
num = i;
}
public int GetNum() {
return num;
}
}
// Обобщенный производный класс,
class Gen : NonGen {
T ob;
public Gen(T o, int i) : base(i) {
ob = o;
}
// Возвратить значение переменной ob.
public T GetOb() {
return ob;
}
}
// Создать объект класса Gen.
class HierDemo3 {
static void Main() {
// Создать объект класса Gen с параметром типа string.
Gen w = new Gen("Привет", 47);
Console.Write(w.GetOb() + " ");
Console.WriteLine(w.GetNum());
}
}
Эта программа дает следующий результат.
Привет 47
В данной программе обратите внимание на то, как класс Gen
наследует от класса NonGen
в следующем объявлении.
class Gen : NonGen {
Класс NonGen
не является обобщенным, и поэтому аргумент типа для него не указывается. Это означает, что параметр Т, указываемый в объявлении обобщенного производного класса Gen, не требуется для указания базового класса NonGen
и даже не может в нем использоваться. Следовательно, класс Gen наследует от класса NonGen
обычным образом, т.е. без выполнения каких-то особых условий.
Переопределение виртуальных методов в обобщенном классе
В обобщенном классе виртуальный метод может быть переопределен таким же образом, как и любой другой метод. В качестве примера рассмотрим следующую программу, в которой переопределяется виртуальный метод GetOb().
// Пример переопределения виртуального метода в обобщенном классе,
using System;
// Обобщенный базовый класс,
class Gen {
protected T ob;
public Gen(T о) {
ob = о;
}
// Возвратить значение переменной ob.
// Этот метод является виртуальным.
public virtual T GetOb() {
Console.Write("Метод GetOb() из класса Gen" + " возвращает результат: ");
return ob;
}
}
// Класс, производный от класса Gen. В этом классе
// переопределяется метод GetOb().
class Gen2 : Gen {
public Gen2(T o) : base(o) { }
// Переопределить метод GetOb().
public override T GetOb() {
Console.Write("Метод GetOb() из класса Gen2" + " возвращает результат: ");
return ob;
}
}
// Продемонстрировать переопределение метода в обобщенном классе,
class OverrideDemo {
static void Main() {
// Создать объект класса Gen с параметром типа int.
Gen iOb = new Gen(88);
// Здесь вызывается вариант метода GetOb() из класса Gen.
Console.WriteLine(iOb.GetOb());
//А теперь создать объект класса Gen2 и присвоить
// ссылку на него переменной iOb типа Gen.
iOb = new Gen2(99);
// Здесь вызывается вариант метода GetOb() из класса Gen2.
Console.WriteLine(iOb.GetOb());
}
}
Ниже приведен результат выполнения этой программы.
Метод GetOb() из класса Gen возвращает результат: 88
Метод GetOb() из класса Gen2 возвращает результат: 99
Как следует из результата выполнения приведенной выше программы, переопределяемый вариант метода GetOb()
вызывается для объекта типа Gen2
, а его вариант из базового класса вызывается для объекта типа Gen
.
Интервал:
Закладка: