Страница 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<T> {</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("К типу T относится " + typeof (T));</b>
<b> }</b>
<b>}</b>
<b>// Продемонстрировать применение обобщенного класса,</b>
<b>class GenericsDemo {</b>
<b> static void Main() {</b>
<b> // Создать переменную ссылки на объект Gen типа int.</b>
<b> Gen<int> iOb;</b>
<b> // Создать объект типа Gen<int> и</b>
<b> // присвоить ссылку на него переменной</b>
<b> iOb = new Gen<int>(102);</b>
<b> // Показать тип данных, хранящихся в переменной iOb.</b>
<b> iOb.ShowType();</b>
<b> // Получить значение переменной iOb.</b>
<b> int v = iOb.GetOb();</b>
<b> Console.WriteLine("Значение: " + v);</b>
<b> Console.WriteLine();</b>
<b> // Создать объект типа Gen для строк.</b>
<b> Gen<string> strOb = new Gen<string>("Обобщения повышают эффективность.");</b>
<b> // Показать тип данных, хранящихся в переменной strOb.</b>
<b> strOb.ShowType();</b>
<b> // Получить значение переменной strOb.</b>
<b> string str = strOb.GetOb();</b>
<b> Console.WriteLine("Значение: " + str);</b>
<b> }</b>
<b>}</b>
Эта программа дает следующий результат.
<b>К типу Т относится System.Int32</b>
<b>Значение: 102</b>
<b>К типу Т относится System.String</b>
<b>Значение: Обобщения повышают эффективность.</b>
Внимательно проанализируем эту программу. Прежде всего обратите внимание на объявление класса Gen в приведенной ниже строке кода:
<b>class Gen<T> {</b>
где Т — это имя параметра типа. Это имя служит в качестве метки-заполнителя конкретного типа, который указывается при создании объекта класса Gen. Следовательно, имя Т используется в классе Gen всякий раз, когда требуется параметр типа. Обратите внимание на то, что имя Т заключается в угловые скобки (< >). Этот синтаксис можно обобщить: всякий раз, когда объявляется параметр типа, он указывается в угловых скобках. А поскольку параметр типа используется в классе Gen, то такой класс считается обобщенным.
В объявлении класса Gen можно указывать любое имя параметра типа, но по традиции выбирается имя Т. К числу других наиболее употребительных имен параметров типа относятся V и Е. Вы, конечно, вольны использовать и более описательные имена, например TValue или ТКеу. Но в этом случае первой в имени параметра типа принято указывать прописную букву Т.
Далее имя Т используется для объявления переменной ob, как показано в следующей строке кода.