Az ő blogbejegyzést kb géppel, Mark Rendle azt mondja, hogy az egyik dolog, amit szeret róla:
„A strukturális gépelés interfészeket. Nagyon szeretnék C # tehetett, hogy”
Mit értett ez alatt?
Az ő blogbejegyzést kb géppel, Mark Rendle azt mondja, hogy az egyik dolog, amit szeret róla:
„A strukturális gépelés interfészeket. Nagyon szeretnék C # tehetett, hogy”
Mit értett ez alatt?
Alapvetően azt jelenti, hogy a felületek összehasonlítjuk a „kacsa gépelés” alapon, és nem olyan típusú személyazonosító alapon.
Tekintsük a következő C # kód:
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
És az azzal egyenértékű géppel kód:
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
A spec nem terjed ki ez a sok részlet, de osztályok „márka”, ami azt jelenti, hogy ugyanazt a kódot, írott osztályok helyett felületek, akkor van egy hiba. C # interfészek megvan márkák, és így nem lehet implicit alakítjuk.
A legegyszerűbb módja annak, hogy úgy gondolja, hogy az, hogy ha megpróbálja a konverzió interfész X interfész Y, ha X minden tagja Y, az átalakítás sikeres, annak ellenére, hogy X és Y nem lehet ugyanaz a neve.
Gondol róla.
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
Mi lenne, ha azt mondta:
interface IButtonEvent { fire: = ...}
interface IMouseButtonEvent { fire: = ...}
...
Géppel lehetővé teszi ezt, a C # nem.
Ahogy géppel célja, hogy jól működik a DOM, amely „laza” gépelés, ez az egyetlen értelmes választani géppel.
Bízom fel az olvasónak, hogy eldöntse, hogy tetszik a „strukturális gépelés” ... ..