Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

The art of Generics

Anna | 17.06.2014 | нет комментариев
Универсальные образцы – они же generics, являются одним из мощнейших инструментов разработки.

CLR поддерживает их на ярусе MSIL, и каждого рантайма, что разрешает нам делать некоторые трюки с типобезопасностью.

Если Вы знакомы с образцами C , но хотели бы провернуть, если не вычисления на этапе компиляции, то по изяществу ничем не уступающие операции на C#, то эта статья поможет в этом.

r (int i = 0; i < arr.Length; i ) { Console.WriteLine(“Reader result: {0}”, reader.Read(arr, i)); //compile-time error } } }
Но это же достигается лишь через способы растяжения?! Как быть если нужно именно реализация интерфейса?

Немножко видоизменим наш интерфейс IReader.

IReader<T>

public interface IReader<T>
{
    T Read(T[] arr, int index);
    bool Supports<TType>();
}

public class SignedIntegersReader : IReader<Int32>, IReader<Int16>, IReader<Int64>
{
    int IReader<int>.Read(int[] arr, int index)
    {
        return arr[index];
    }

    short IReader<short>.Read(short[] arr, int index)
    {
        return arr[index];
    }

    long IReader<long>.Read(long[] arr, int index)
    {
        return arr[index];
    }

    public bool Supports<TType>()
    {
        return this as IReader<TType> != null;
    }
}


И добавим еще одну реализацию IReader — DefaultReader.

public class DefaultReader<T> : IReader<T>
{
    private IReader<T> _reader = new SignedIntegersReader() as IReader<T>;

    public T Read(T[] arr, int index)
    {
        if (_reader != null)
        {
            return _reader.Read(arr, index);
        }
        return default(T);
    }

    public bool Supports<TType>()
    {
        return _reader.Supports<TType>();
    }
}


Проверим на практике:

class Program
{
    static void Main(string[] args)
    {
        var reader = new DefaultReader<int>();

        var arr = new int[] { 128, 256 };

        if (reader.Supports<int>())
        {
            for (int i = 0; i < arr.Length; i  )
            {
                Console.WriteLine("Reader result: {0}", reader.Read(arr, i));
            }
        }
    }
}


Таким образом, мы получили две реализации задачи проверки перегрузки по параметризированным типам – как во время компиляции, так и выполнения.

 Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB