Sobes.tech
Middle

Aký je rozdiel medzi protokolmi a triedami, keď ide o abstraktné triedy?

sobes.tech AI

Odpoveď od AI

Protokol definuje zmluvu — skup zahteva (metoda, svojstava, inicijalizatora) koje mora implementirati tip koji odgovara ovom protokolu. Protokoli nemaju implementaciju većine svojih zahteva. Nije mogoče ustvariti primerkov protokola.

Abstraktna razred v jezikih, različnih od Swifta (npr. Java), predstavlja razred, ki ga ni mogoče neposredno instancirati. Vsebuje tako implementirane metode (ali lastnosti), kot tudi abstraktne metode, ki jih morajo implementirati v svojih podrazredih.

V Swifta ne obstaja koncept abstraktnih razredov v njihovem tradicionalnem razumevanju. Funkcionalnost abstraktnih razredov se doseže s kombinacijo protokolov in razredov.

Z uporabo protokola lahko določite vmesnik, nato pa ustvarite običajen razred, ki ustreza temu protokolu in zagotavlja implementacijo. Delna implementacija protokola je možna z razširitvami (protocol extensions), vendar to ne naredi protokola "abstraktnega razreda" v čistem pomenu.

Protokol (Swift) Abstraktni razred (tradicionalni)
Namen Določitev pogodbe (vmesnika) Določitev skupnega vedenja in strukture z možnostjo delne implementacije
Implementacija Običajno ne vsebuje implementacije (razen razširitev) Lahko vsebuje tako implementirane, kot tudi abstraktne metode
Instanciranje Ni mogoče ustvariti primerka protokola Ni mogoče neposredno ustvariti primerka abstraktnega razreda
Dedovanje Skladnost s protokolom (conformance) Dedovanje (inheritance)
Večkratno dedovanje Tip se lahko sklada z več protokoli Razred se lahko deduje le od enega razreda (v večini jezikov)
V Swiftu Glavna oblika abstrakcije Ni neposrednega ekvivalenta, se posnema z protokoli in razredi

Primer posnemanja abstraktnega razreda s pomočjo protokola in razreda v Swiftu:

Protokol, ki določa abstraktne zahteve:

// Protokol, kot pogodba
protocol Drawable {
    func draw()
    var color: String { get set }
}

Razred, ki ustreza protokolu in zagotavlja implementacije:

// Razred, ki implementira protokol
class Circle: Drawable {
    var color: String

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

    func draw() {
        print("Risanje kroga barve \(color)")
    }
}

Razširitev za zagotavljanje privzete delne implementacije:

// Razširitev za zagotavljanje privzete implementacije (ne naredi protokola abstraktnega razreda)
extension Drawable {
    func draw() {
        print("Začetek risanja nečesa barve \(color)")
    }
}

Na ta način, v Swiftu, protokoli igrajo ključno vlogo pri doseganju polimorfizma in abstrakcije, nadomeščajo koncept abstraktnih razredov iz drugih jezikov.