No, non è la digitazione di anatre
Direi che questo è non una forma accettabile di digitazione anatra in un linguaggio statico.
In un linguaggio che supporta la digitazione anatra, ci si aspetterebbe di essere in grado di definire una funzione che accetta un oggetto foo
di tipo non specificato che definisce una funzione (o proprietà) bar
.
def call_bar (foo) {
foo.bar
}
Alla funzione non interessa il tipo foo
, solo che è bar
. Il tuo sistema non fornisce alcun modo per una funzione di prendere un oggetto di qualsiasi tipo, purché quel tipo definisca le funzioni richieste.
Quindi, come possiamo digitare la digitazione in una lingua tipizzata staticamente?
1. Interfacce
Bene, l'approccio tipico nella maggior parte delle lingue è definire le interfacce . Questo non ci porta tutti nel modo in cui ci sono, ma ci avvicina. Possiamo almeno definire un contratto con il quale identifichiamo tutte le funzioni / proprietà / etc pertinenti su un tipo.
Una funzione può quindi essere scritta in modo tale da accettare input per interfaccia, piuttosto che classi concrete. Manteniamo la possibilità di controllare il tipo in fase di compilazione, per garantire che le funzioni richieste esistano sugli input, pur ottenendo la flessibilità di ignorare i dettagli di implementazione.
2. Digitazione strutturale
Scala ha un approccio interessante a questo, che offre un modo molto più flessibile per ottenere un comportamento tipizzato da anatra in un linguaggio statico. Scala consente di fare riferimento a un tipo in termini di membri, utilizzando la seguente sintassi:
def callBar(foo : { def bar() : Unit }) = {
foo.bar()
}
Questo corrisponderà a tutti i tipi che definiscono la funzione bar
, non accettando input e restituendo output void. Conserva anche i vantaggi statici di tipizzazione di un linguaggio statico, anziché fare affidamento sull'associazione tardiva per determinare se gli input avranno o meno i membri giusti.