У меня на эту тему была идея: а что если разрешить в интерфейсе реализацию методов? Внутри эту фичу реализовать как методы-расширения (с неявным this).
Т.е. например:
public interface IA
{
Add(s : string) : void;
public Add(o : object) : void
{
Add(s.ToString());
}
}
Хотелось бы, чтобы для клиентского кода были следующие отличия от обычных методов-расширений:
Приоритет этих методов интерфейсов перед обычными методами расширениями при выборе перегрузок (т.е. если есть метод интерфейса с нужной сигнатурой, то методы-расширения даже не искать).
Чтобы не требовалось открывать namespace, в котором реализован интерфейс, для того, чтобы эти методы интерфейса были доступны.
A>У меня на эту тему была идея: а что если разрешить в интерфейсе реализацию методов? Внутри эту фичу реализовать как методы-расширения (с неявным this).
отличная идея! И в методах классов надо разрешить объявлять методы интерфейсов! Вместе со статическими методами в интерфейсах это очень разнообразит нашу девелоперскую жизнь, сделает её полной сюрпризов и неожиданностей!
Здравствуйте, artelk, Вы писали:
A>У меня на эту тему была идея: а что если разрешить в интерфейсе реализацию методов? Внутри эту фичу реализовать как методы-расширения (с неявным this). A>Т.е. например:
Для этого есть абстрактный базовый класс.
Не нужно это в интерфейсы пихать.
Здравствуйте, artelk, Вы писали:
A>Для этого есть обычные методы-расширения ( Add(this @this : IA, o : object) : void {...} ), но иногда хочется вот такого
Если бы были операторы расширения, а раз их нет, то как раз это могло бы и решить проблему.
Я помню, что хотел подобного, но не помню уже зачем.
Что касается статических методов, то хотелось бы иметь возможность по ним кваинтифицироваться по аналогии с F#.
Здравствуйте, STDray, Вы писали:
_NN>>CIL позволяет создавать статические методы в интерфейсе: How to: Create Interfaces with Static Methods via IL?. _NN>>Что думаете по поводу добавления этой фичи в язык ?
STD>Я помню, что хотел подобного, но не помню уже зачем.
Ну вот, оказывается это даже возможно =)
STD>Что касается статических методов, то хотелось бы иметь возможность по ним кваинтифицироваться по аналогии с F#.
Что-то сходу не вник.
Это аналог шаблонов С++ в .NET ?
Макросы делают тоже самое, только в менее удобном виде.
Т.е. нужны легковесные макросы для более простых вещей.
Правильно я понимаю ?
_NN>Что-то сходу не вник. _NN>Это аналог шаблонов С++ в .NET ?
Да.
_NN>Макросы делают тоже самое, только в менее удобном виде. _NN>Т.е. нужны легковесные макросы для более простых вещей. _NN>Правильно я понимаю ?
Да все верно. В качестве замены структурного сабтайпинга.
Наверное было бы удобно для очень простых вещей.
Другое дело сколько такого кода есть, ведь все начинается с простого а потом сразу становится сложным.
Хороший пример шаблоны С++, вроде началось безобидно с генерации кода, а на деле нужно нормальное метапрограммирование.
Думаю, что стоит сделать поддержку в компиляторе, не запретить в языке. Тогда можно будет использовать это дело для разных реализаций вроде traits в макроса, но при этом не удивлять людей странностями.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Думаю, что стоит сделать поддержку в компиляторе, не запретить в языке. Тогда можно будет использовать это дело для разных реализаций вроде traits в макроса, но при этом не удивлять людей странностями.
Забавно конечно, я как-то об этом и не подумал.
Похоже вот она идея решения , осталось всего немного — реализовать %)
Здравствуйте, _NN_, Вы писали:
_NN>CIL позволяет создавать статические методы в интерфейсе: How to: Create Interfaces with Static Methods via IL?. _NN>Что думаете по поводу добавления этой фичи в язык ?
_NN>Можно сделать специальный атрибут ,чтобы нельзя было добавить просто так по ошибке, скажем: _NN>
_NN>interface IA
_NN>{
_NN> [StaticInterfaceMethod]
_NN> static F() : int { 0 }
_NN>}
_NN>
А как вызывать статический метод? Мне известен только интерфейс, реализация мне неизвестна.
def foo = IA.F()
?
Re[2]: Статические методы в интерфейсе
От:
Аноним
Дата:
23.10.13 07:36
Оценка:
А>А как вызывать статический метод? Мне известен только интерфейс, реализация мне неизвестна.
def foo = IA.F()
?
Мое мнение, для тех, кто будет юзать интерфейс эта фича бесполезна
Здравствуйте, Аноним, Вы писали:
А>А как вызывать статический метод? Мне известен только интерфейс, реализация мне неизвестна.
def foo = IA.F()
?
Статический метод будет не интерфейсом, а реализацией. Так что вызвать его можно без проблем.
Тут вопрос скорее политический. Насколько это будет смущать.
По тому я предлагаю сделать возможность в API компилятора, но не давать ее в синтаксисе. Тогда в макросах можно будет использовать это дело для реализации разных интересных вещей вроде трейтсов, но рядовой пользователь не будет видеть этого.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.