В своем блоге о машинописи, Марк Rendle говорит, что одна из вещей , которые он любит о нем:
«Структурно типирование для интерфейсов. Я действительно хочу C # может сделать это»
Что он имел в виду под этим?
В своем блоге о машинописи, Марк Rendle говорит, что одна из вещей , которые он любит о нем:
«Структурно типирование для интерфейсов. Я действительно хочу C # может сделать это»
Что он имел в виду под этим?
В основном, это означает, что интерфейсы сравниваются на «утку набрав» основе, а не на идентичности типа основе.
Рассмотрим следующий C # код:
interface X1 { string Name { get; } }
interface X2 { string Name { get; } }
// ... later
X1 a = null;
X2 b = a; // Compile error! X1 and X2 are not compatible
И эквивалентный код Машинопись:
interface X1 { name: string; }
interface X2 { name: string; }
var a: X1 = null;
var b: X2 = a; // OK: X1 and X2 have the same members, so they are compatible
В спецификации не покрывает это очень подробно, но классы «бренды» , что означает один и тот же код, написанный с классами вместо интерфейсов, будет иметь ошибку. # Интерфейсов C есть бренды, и , таким образом , не могут быть неявно преобразованы.
Самый простой способ думать об этом, что если вы пытаетесь преобразование из интерфейса X интерфейс Y, если X имеет все члены Y, преобразование завершается успешно, даже если X и Y не могут иметь одинаковые имена.
Думать о.
class Employee { fire: = ..., otherMethod: = ...}
class Missile { fire: = ..., yetMoreMethod: = ...}
interface ICanFire { fire: = ...}
val e = new Employee
val m = new Missile
ICanFire bigGuy = if(util.Random.nextBoolean) e else m
bigGuy.fire
Что если бы мы сказали:
interface IButtonEvent { fire: = ...}
interface IMouseButtonEvent { fire: = ...}
...
Машинопись допустит, C # не будет.
Как машинопись стремится хорошо работать с DOM, которая использует «свободный» ввод с клавиатуры, это единственный разумный выбор для машинописи.
Я оставляю это до читателя, чтобы решить, если им нравится «Structural печатать» ... ..