Программирование
Веб программирование

Обобщения C#

 
 

Как известно, многие программисты на языке C++ уж давно привыкли к удобствам, что предоставляют им шаблоны. Суть в том, что в C# 'template' как такового нет, зато есть обобщения (generics), которые отличаются не только названием, однако суть та же.

Некоторый пример

Для примера создадим обобщенный класс, пущай называется "GenericClass", а затем его экземпляр в различных типах:

using System;
using System.Text;
 
class GenericClass
{
    public void Foo(T bar)
    {
        if (bar is int)
            Console.WriteLine("Param is int and contains ", bar);
        else if (bar is string)
            Console.WriteLine("Param is string and contains ", bar);
        else
            Console.WriteLine("Param is T and contains ", bar);
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        GenericClass a1 = new GenericClass();
        a1.Foo(12345);
 
        GenericClass a2 = new GenericClass();
        a2.Foo("abcdef");
 
        GenericClass a3 = new GenericClass();
        a3.Foo(1.5);
 
        Console.ReadKey();
    }
}

Как-то так. Здесь, имея обобщенный класс GenericClass и метод Foo() в нем, мы проверяем тип аргумента param, которое принимает наш метод, и если тип param - int, выводим одно, если string - другое, иначе - третье. На C++ сие выглядело бы так:

#include 
#include 
#include <conio.h>
 
using namespace std;
 
template class GenericClass
{
public:
        void Foo(T bar)
        {
                std::cout << "Param is T and contains " << bar << endl;
        }
};
 
template<> void GenericClass::Foo(int bar)
{
        cout << "Param is int and contains " << bar << endl;
}
 
template<> void GenericClass::Foo(std::string bar)
{
        cout << "Param is string and contains " << bar << endl;
}
 
int main()
{
        GenericClass a2;
        a2.Foo(123);
 
        GenericClass a1;
        a1.Foo("abc");
 
        GenericClass a3;
        a3.Foo(1.5);
 
        _getch();
}

Как видите, здесь нет условной проверки типа аргумента, однако явно определены две вариации метода Foo для типов int и string, однако если же тип не соответствует ни int ни string, вызывается "универсальная" конструкция метода для типа T, которая определена в классе.

Целью сей статьи было рассказать вам об обобщениях в языке C# и привести шаблонный код на языке C++, дабы вы научились работать с обобщениями на шарпе и посмотрели, как это выглядет на плюсах, однако, если у вас остались вопросы, задавайте их в комментариях. И все же я надеюсь, что после прочтения этой статьи вы сможете самостоятельно использовать обобщения в своих программах.

На этом, думаю, все. Удачи :).


Есть вопросы? Спроси на нашем форуме!!
Нет комментариев

Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.