Console.Write(x.GetOb());
Console.WriteLine(x.GetObj2());
}
}
Обратите внимание на приведенное ниже объявление класса Gen2 в данном варианте иерархии классов.
class Gen2<T, V> : Gen<T> {
В этом объявлении Т — это тип, передаваемый базовому классу Gen; а V — тип, характерный только для производного класса Gen2. Он служит для объявления объекта оЬ2 и в качестве типа, возвращаемого методом GetOb j 2 (). В методе 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<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 обычным образом, т.е. без выполнения каких-то особых условий.
Переопределение виртуальных методов в обобщенном классе
