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

Страница 271 из 502

---------------------------------

ПРИМЕЧАНИЕ

Программирующим на C++ и Java необходимо иметь в виду, что обобщения в C# не следует путать с шаблонами в C++ и обобщениями в Java, поскольку это разные, хотя и похожие средства. В действительности между этими тремя подходами к реализации обобщений существуют коренные различия. Если вы имеете некоторый опыт программирования на C++ или Java, то постарайтесь на основании этого опыта не делать никаких далеко идущих выводов о том, как обобщения'действуют в С#.

---------------------------------

Простой пример обобщений

Начнем рассмотрение обобщений с простого примера обобщенного класса. В приведенной ниже программе определяются два класса. Первым из них является обобщенный класс Gen, вторым — класс GenericsDemo, в котором используется класс Gen.

<b>// Простой пример обобщенного класса, </b>

<b>using System;</b>

<b>//В приведенном ниже классе Gen параметр типа Т заменяется</b>

<b>// реальным типом данных при создании объекта типа Gen.</b>

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

<b>  T ob; // объявить переменную типа Т</b>

<b>  // Обратите внимание на то, что у этого конструктора</b>

<b>  // имеется параметр типа T</b>

<b>  public Gen(T о) {</b>

<b>    ob = о;</b>

<b>  }</b>

<b>  // Возвратить переменную экземпляра ob,</b>

<b>  //которая относится к типу Т.</b>

<b>  public T GetOb() {</b>

<b>    return ob;</b>

<b>  }</b>

<b>  // Показать тип Т.</b>

<b>  public void ShowType() {</b>

<b>    Console.WriteLine(&quot;К типу T относится &quot; + typeof (T));</b>

<b>  }</b>

<b>}</b>

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

<b>class GenericsDemo {</b>

<b>  static void Main() {</b>

<b>    // Создать переменную ссылки на объект Gen типа int.</b>

<b>    Gen&lt;int&gt; iOb;</b>

<b>    // Создать объект типа Gen&lt;int&gt; и</b>

<b>    // присвоить ссылку на него переменной</b>

<b>    iOb = new Gen&lt;int&gt;(102);</b>

<b>    // Показать тип данных, хранящихся в переменной iOb.</b>

<b>    iOb.ShowType();</b>

<b>    // Получить значение переменной iOb.</b>

<b>    int v = iOb.GetOb();</b>

<b>    Console.WriteLine(&quot;Значение: &quot; + v);</b>

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

<b>    // Создать объект типа Gen для строк.</b>

<b>    Gen&lt;string&gt; strOb = new Gen&lt;string&gt;(&quot;Обобщения повышают эффективность.&quot;);</b>

<b>    // Показать тип данных, хранящихся в переменной strOb.</b>

<b>    strOb.ShowType();</b>

<b>    // Получить значение переменной strOb.</b>

<b>    string str = strOb.GetOb();</b>

<b>    Console.WriteLine(&quot;Значение: &quot; + str);</b>

<b>  }</b>

<b>}</b>

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

<b>К типу Т относится System.Int32</b>

<b>Значение: 102</b>

<b>К типу Т относится System.String</b>

<b>Значение: Обобщения повышают эффективность.</b>

Внимательно проанализируем эту программу. Прежде всего обратите внимание на объявление класса Gen в приведенной ниже строке кода:

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

где Т — это имя параметра типа. Это имя служит в качестве метки-заполнителя конкретного типа, который указывается при создании объекта класса Gen. Следовательно, имя Т используется в классе Gen всякий раз, когда требуется параметр типа. Обратите внимание на то, что имя Т заключается в угловые скобки (< >). Этот синтаксис можно обобщить: всякий раз, когда объявляется параметр типа, он указывается в угловых скобках. А поскольку параметр типа используется в классе Gen, то такой класс считается обобщенным.

В объявлении класса Gen можно указывать любое имя параметра типа, но по традиции выбирается имя Т. К числу других наиболее употребительных имен параметров типа относятся V и Е. Вы, конечно, вольны использовать и более описательные имена, например TValue или ТКеу. Но в этом случае первой в имени параметра типа принято указывать прописную букву Т.

Далее имя Т используется для объявления переменной ob, как показано в следующей строке кода.