W swoim blogu o maszynopis, Mark Rendle mówi, że jedną z rzeczy, lubi o to:
„Wpisując strukturalne dla interfejsów. Naprawdę chciałbym C # może zrobić, że”
Co miał na myśli?
W swoim blogu o maszynopis, Mark Rendle mówi, że jedną z rzeczy, lubi o to:
„Wpisując strukturalne dla interfejsów. Naprawdę chciałbym C # może zrobić, że”
Co miał na myśli?
Zasadniczo oznacza to, że interfejsy są porównywane na „kaczka wpisując” zasadach, a nie na zasadzie rodzaj tożsamości.
Rozważmy następujący kod 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
I równowartość kod maszynopis:
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
Spec nie obejmuje to na wiele szczegółów, ale zajęcia mają „marki”, co oznacza ten sam kod, napisany z klas zamiast interfejsów, by mieć błąd. C # interfejsy mają marki, a tym samym nie można niejawnie konwertowane.
Najprostszym sposobem, aby myśleć o tym, że jeśli próbujesz konwersję z interfejsu X do interfejsu Y, jeżeli X ma wszystkich członków Y, konwersja powiedzie, chociaż X i Y nie może mieć te same nazwy.
Myśleć o.
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
Co zrobić, jeśli mamy powiedział:
interface IButtonEvent { fire: = ...}
interface IMouseButtonEvent { fire: = ...}
...
Maszynopis pozwoli to, C # nie będzie.
Jak ma maszynopis do pracy z DOM, który używa „luźne” pisanie, że jest to jedyny rozsądny wybór dla maszynopisu.
Zostawiam ją do czytnika, aby zdecydować, czy podoba im pisanie „strukturalne” ... ..