Dans son blog à propos tapuscrit, Mark Rendle dit que l' une des choses qu'il aime à ce sujet est:
« Frappe structurelle pour les interfaces. Je souhaite vraiment que C # pourrait faire »
Que voulait-il dire par là?
Dans son blog à propos tapuscrit, Mark Rendle dit que l' une des choses qu'il aime à ce sujet est:
« Frappe structurelle pour les interfaces. Je souhaite vraiment que C # pourrait faire »
Que voulait-il dire par là?
En gros, cela signifie que les interfaces sont comparés sur une base « canard de frappe » plutôt que sur une base d'identité de type.
Considérons le code 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
Et l'équivalent code tapuscrit:
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
La spécification ne couvre pas dans les détails, mais les classes ont des « marques » qui signifie le même code, écrit avec des classes au lieu d'interfaces, aurait une marge d'erreur. C # interfaces ont des marques, et ne peuvent donc pas être converti implicitement.
La façon la plus simple d'y penser est que si vous essayez une conversion de l'interface X à l'interface Y, si X a tous les membres de Y, la conversion réussit, même si X et Y pourraient ne pas avoir les mêmes noms.
Penser à.
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
Et si on dit:
interface IButtonEvent { fire: = ...}
interface IMouseButtonEvent { fire: = ...}
...
Tapuscrit permettra cela, C # ne sera pas.
Comme tapuscrit vise à bien travailler avec le DOM qui utilise en tapant « lâche », il est la seule raisonnable pour choisir tapuscrit.
Je laisse au lecteur de décider s'ils aiment « taper structure » ... ..