La tipizzazione implicita in lingue come C # consente verifiche del tipo in fase di compilazione senza necessariamente riferirsi a "direttamente" "in una classe di destinazione:
var toy = SantasWorkshop.Build();
toy.amuse();
In questo scenario, non abbiamo bisogno di sapere che tipo di toy
è. Eppure, sappiamo ancora in fase di compilazione se la nostra toy
non riesce a amuse()
.
Tuttavia, questo è limitato all'ambito locale. Se vogliamo mettere quel toy
in Stocking
e mantenere i controlli in fase di compilazione, dobbiamo sapere qualcosa al riguardo in fase di compilazione, a parte la sua capacità di amuse()
. Ad esempio, questo è illegale:
class Stocking {
List<var> toys;
public void add(var toy) {
toys.add(toy);
}
}
Se siamo disposti a sacrificare il controllo in fase di compilazione, le lingue come C # ci consentono di utilizzare digitazione dinamica :
class QuestionableLookingStocking {
List<dynamic> toysIHope;
public void add(dynamic toyIHope) {
toysIHope.add(toyIHope);
}
}
Ma questo ci permetterà di aggiungere oggetti a un QuestionableLookingStocking
che potrebbe non essere effettivamente amuse()
. E non lo sapremo fino a quando qualcuno non aggiungerà Coal
in fase di runtime.
class Coal {
public ChristmasMood ruinChristmas() {
return new SadChristmas();
}
}
Sarebbe logicamente possibile e fattibile estendere la digitazione implicita ai membri? Vale a dire, c'è qualche ragione per cui il compilatore non può lamentarsi se qualcuno prova a Stocking.add()
un oggetto che non fa? t supportare le operazioni richieste da tutti i riferimenti a Stocking.toys[n]
?
Esistono pattern che possono simulare tipi di membri impliciti?