Добавить в цитаты Настройки чтения

Страница 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 &lt; string, int &gt; x =</b>

<b>             new Gen2&lt;string, int&gt;(&quot;Значение равно: &quot;, 99);</b>

<b>    Console.Write(x.GetOb());</b>

<b>    Console.WriteLine(x.GetObj2());</b>

<b>  }</b>

<b>}</b>

Обратите внимание на приведенное ниже объявление класса Gen2 в данном варианте иерархии классов.

<b>class Gen2&lt;T, V&gt; : Gen&lt;T&gt; {</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&lt;T&gt; : 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&lt;String&gt; w = new Gen&lt;String&gt;(&quot;Привет&quot;, 47);</b>

<b>    Console.Write(w.GetOb() + &quot; &quot;);</b>

<b>    Console.WriteLine(w.GetNum());</b>

<b>  }</b>

<b>}</b>

Эта программа дает следующий результат.

<b>Привет 47</b>

В данной программе обратите внимание на то, как класс Gen наследует от класса NonGen в следующем объявлении.

<b>class Gen&lt;T&gt; : NonGen {</b>

Класс NonGen не является обобщенным, и поэтому аргумент типа для него не указывается. Это означает, что параметр Т, указываемый в объявлении обобщенного производного класса Gen, не требуется для указания базового класса NonGen и даже не может в нем использоваться. Следовательно, класс Gen наследует от класса NonGen обычным образом, т.е. без выполнения каких-то особых условий.

Переопределение виртуальных методов в обобщенном классе

В обобщенном классе виртуальный метод может быть переопределен таким же образом, как и любой другой метод. В качестве примера рассмотрим следующую программу, в которой переопределяется виртуальный метод GetOb().

<b>// Пример переопределения виртуального метода в обобщенном классе,</b>