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