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.