Duck typing
todo Permette di implementare il concetto di polimorfismo senza ereditarietà o interfacce condivise.
”Se istanzio un oggetto di una classe e ne invoco metodi/attributi, l’unica cosa che conta è che i metodi/attributi siano definiti per quell’oggetto”
Il controllo, duck test, viene effettuato dall’interprete a run time. È possibile grazie al type checking dinamico.
In un linguaggio ad oggetti non dinamico, si avrebbe un’interfaccia/protocollo, con un metodo, e gli oggetti che implementano quel protocollo lo devono implementare.
protocol A {
func a()
}
func c(_ obj: A) {
obj.a()
}Affinché possa essere chiamata la funzione c(), bisogna essere sicuri che l’oggetto passato sia conforme al protocollo A. Se non lo fosse, ci sarebbe un errore di compilazione.
In un linguaggio dinamico, invece, basta che al momento che l’oggetto sul quale si chiama la funzione, implementi un metodo con stesso nome e stesso numero di parametri, al momento della chiamata.
class A:
def a(self):
print("CIAO")
def f(obj):
obj.a()
a = A()
f(a) # funziona
# ma può funzionare anche
def c(obj):
a.b = lambda: print("B function")
obj.b()
c(a) # funziona e stampa "B function"