Milyen diszpécser mechanizmus alkalmazható egy protokollban meghatározott módszer hívásakor, amelyet egy Extension segítségével bővítettek?
sobes.tech MI
Válasz az MI-től
Swiftben, ha egy módszer protokollban van meghatározva, majd a protokollt egy Extension segítségével kiterjesztik ennek a módszernek a megvalósításával, akkor a protokollra mutató hivatkozáson keresztül történő hívás esetén a statikus diszpécsió (static dispatch) kerül alkalmazásra. Ez azt jelenti, hogy a módszer hívása a protokoll kiterjesztéséből származó megvalósításra irányul, nem pedig egy konkrét típusban lévő megvalósításra, még akkor sem, ha a típus felülírja azt.
Más szóval, a protokoll kiterjesztéseiben megvalósított módszerek nem támogatják a dinamikus diszpécsiót (dynamic dispatch), ellentétben a típusokban megvalósított kötelező módszerekkel.
Példa:
protocol MyProtocol {
func requiredMethod()
}
extension MyProtocol {
func requiredMethod() {
print("Alapértelmezett megvalósítás kiterjesztésben")
}
}
struct MyStruct: MyProtocol {
func requiredMethod() {
print("MyStruct-ben megvalósítás")
}
}
let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Kiírja: "Alapértelmezett megvalósítás kiterjesztésben"
Ez azért van, mert a protokoll kiterjesztéseiből származó módszerek nem szerepelnek a virtuális hívási táblában (vtable), és közvetlenül hívódnak meg.