Лингвофорум

Лингвоблоги => Личные блоги => Блоги => Алексей Гринь => Тема начата: Алексей Гринь от марта 14, 2012, 23:45

Название: Как бы я сделал extension classes в C#
Отправлено: Алексей Гринь от марта 14, 2012, 23:45
Авторы C# реализовали так:

    public static class StringExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' },
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   


А мне сегодня пришла в голову идея, что можно было бы реализовать так:

    public static class ExtendedString: String
    {
        public int WordCount()
        {
            return this.Split(new char[] { ' ', '.', '?' },
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   


По спецификации статический класс и так не мог наследовать другой класс:
ЦитироватьA static class may not include a class-base specification (§10.1.4) and cannot explicitly specify a base class or a list of implemented interfaces.
так что эту идиому можно было бы переосмыслить как "экстеншн-класс".

Плюс в том, что используем обычный this при обращении к полям и методам (публичным), и выглядит всё естественнее. Минус в том, что больше магии и меньше понимания, чё происходит.