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