Sobes.tech
Middle

Kokia yra skirtumas tarp protokolų ir klasių, kai kalbama apie abstrakčias klases?

sobes.tech AI

Atsakymas iš AI

Protokolas apibrėžia sutartį — rinkinius reikalavimų (metodų, savybių, inicializatorių), kuriuos turi įgyvendinti su šiuo protokolu atitinkamas tipas. Protokolai neturi daugumos savo reikalavimų įgyvendinimo. Iš protokolo sukurti egzempliorių neįmanoma.

Abstrakti klasė kituose nei Swift kalbose (pvz., Java) yra klasė, kurios tiesiogiai sukurti negalima. Ji apima tiek įgyvendintus metodus (ar savybes), tiek abstrakčius metodus, kuriuos turi įgyvendinti jos pogrupiai.

Swift kalboje nėra tradicinės supratimo apie abstrakčias klases. Abstrakčių klasių funkcionalumas pasiekiamas derinant protokolus ir klases.

Naudojant protokolą, galima apibrėžti sąsają, o tada sukurti įprastą klasę, atitinkančią šį protokolą ir teikiančią įgyvendinimą. Dalinė protokolo įgyvendinimo dalis gali būti teikiama per plėtinius (protocol extensions), tačiau tai nepadaro protokolo "abstrakčia klase" gryna prasme.

Protokolas (Swift) Abstrakti klasė (tradicinė)
Paskirtis Sutarties (sąsajos) apibrėžimas Bendro elgesio ir struktūros apibrėžimas su galimybe dalinės įgyvendinimo
Įgyvendinimas Paprastai neturi įgyvendinimo (išskyrus plėtinius) Gali turėti tiek įgyvendintus, tiek abstrakčius metodus
Egzempliorių kūrimas Negalima sukurti protokolo egzemplioriaus Negalima tiesiogiai sukurti abstrakčios klasės egzemplioriaus
Paveldėjimas Atitiktis protokolui (conformance) Paveldėjimas (inheritance)
Daugkartinis paveldėjimas Tipas gali atitikti kelis protokolus Klasė gali paveldėti tik iš vienos klasės (daugelyje kalbų)
Swift Pagrindinė abstrakcijos forma Tiesioginis ekvivalentas neegzistuoja, imituojama per protokolus ir klases

Pavyzdys, kaip imituoti abstrakčią klasę naudojant protokolą ir klasę Swift kalboje:

Protokolas, apibrėžiantis abstrakčius reikalavimus:

// Protokolas kaip sutartis
protocol Drawable {
    func draw()
    var color: String { get set }
}

Klasė, atitinkanti protokolą ir teikianti įgyvendinimą:

// Klasė, įgyvendinanti protokolą
class Circle: Drawable {
    var color: String

    init(color: String) {
        self.color = color
    }

    func draw() {
        print("Piešiamas apskritimas su spalva \(color)")
    }
}

Plėtinys, teikiantis numatytą dalinį įgyvendinimą:

// Plėtinys, teikiantis numatytą įgyvendinimą (nepadaro protokolo abstrakčia klase)
extension Drawable {
    func draw() {
        print("Pradedame piešti kažką su spalva \(color)")
    }
}

Taip, Swift protokolai atlieka pagrindinį vaidmenį pasiekiant polimorfizmą ir abstrakciją, pakeisdami kitų kalbų abstrakčių klasių koncepciją.