Pull to refresh

Comments 18

Обычно для этого интерфейсы обзывают в стиле IHaveSomeProperty. В целях улучшения читаемости.
У нас принято INameField в целях краткости :)
А у меня на каком-то проект было I(FieldName)Holder (к примеру, ISessionHolder).
интересно на какой практике это могло использоваться
У огромного количества сущностей есть такие поля как владелец, дата создания, etc. Периодически их имеет смысл унифицированно обрабатывать.
В F#, кстати, есть generic constraint'ы по сигнатурам методов. Но сделаны они не нативно для CLR, а через атрибуты, от чего понятны только компилятору F#. Выглядят примерно так:

type Class<'T when 'T : (static member staticMethod1 : unit -> 'T) > =
    class end
Забавно, даже статический метод. А сигнатуры конструкторов он понимает?
Структурная типизация — это прекрасная вещь в дополнение к «классической» номинативной (в Go мне тоже эта фича понравилась).
Но у вас нет как таковой структурной типизации.
Структурную типизацию можно реализовать используя T4 или любой другой «препроцессор», либо использовать вейверы, для сторонних библиотек.

PS: Лучше иметь IGetPropertyA и ISetPropertyB
в C#, структурная типизация не поддерживается

Это не совсем верно. Структурная типизация поддерживается в очень ограниченных масштабах. Например, в foreach итерируемый объект должен иметь метод GetEnumerator, возвращающий объект с методом MoveNext и свойством Current. Оператор await применим к любому объекту, реализующему awaitable паттерн – опять же, никаких интерфейсов и базовых типов. LINQ-операторы тоже ожидают наличия методов .Select, .SelectMany, .Where и других. Ну и в дополнение ко всему, вроде бы во всех упомянутых сценариях это могут быть как extension-методы, так и «обычные».
А разве это не утиная типизация?

В википедийной статье по ссылке из поста про различия между структурной и утиной типизациями говорится так:

"...compatibility and equivalence are determined by the type's actual structure or definition [...] It contrasts with [...] duck typing, in which only the part of the structure accessed at runtime is checked for compatibility".
Обычно под утиной понимают типизацию в рантайме. А тут всё-таки при компиляции всё происходит.
Нет, это именно структурная типизация. Ошибки «несовместимости» детектируются не в рантайме, а в момент компиляции. Например, при попытке использования foreach с объектом, у которого нет метода GetEnumerator, вы получите ошибку компиляции.
Sign up to leave a comment.

Articles