Sobes.tech
Junior — Middle

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.