Quale meccanismo di dispatch viene applicato quando si chiama un metodo definito in un protocollo che è stato esteso tramite un'Extension?
sobes.tech AI
Risposta dell'AI
In Swift, se un metodo è definito in un protocollo e successivamente il protocollo viene esteso tramite un'Extension con l'implementazione di quel metodo, la chiamata al metodo tramite una referenza al protocollo utilizza la dispatch statica (static dispatch). Ciò significa che la chiamata al metodo sarà indirizzata all'implementazione dell'estensione del protocollo, e non all'implementazione nel tipo specifico, anche se il tipo la sovrascrive.
In altre parole, i metodi implementati nelle estensioni dei protocolli non supportano la dispatch dinamica (dynamic dispatch), a differenza dei metodi obbligatori del protocollo implementati nei tipi.
Esempio:
protocol MyProtocol {
func requiredMethod()
}
extension MyProtocol {
func requiredMethod() {
print("Implementazione di default nell'estensione")
}
}
struct MyStruct: MyProtocol {
func requiredMethod() {
print("Implementazione in MyStruct")
}
}
let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Stampa "Implementazione di default nell'estensione"
Questo perché i metodi delle estensioni dei protocolli non sono presenti nella tabella delle chiamate virtuali (vtable) e vengono chiamati direttamente.