Koja je razlika između protokola i klasa kada je reč o apstraktnim klasama?
sobes.tech АИ
Одговор од АИ
Protokol definiše ugovor — skup zahteva (metoda, svojstava, inicijalizatora) koje mora implementirati tip koji odgovara ovom protokolu. Protokoli nemaju implementaciju većine svojih zahteva. Nije moguće kreirati instance protokola.
Apstraktna klasa u jezicima različitim od Swifta (npr. Java) predstavlja klasu koja se ne može direktno instancirati. Sadrži kako implementirane metode (ili svojstva), tako i apstraktne metode koje moraju biti implementirane u njenim podklasama.
U Swiftu ne postoji koncept apstraktnih klasa u njihovom tradicionalnom shvatanju. Funkcionalnost apstraktnih klasa se postiže kombinacijom protokola i klasa.
Koristeći protokol, možete definisati interfejs, a zatim kreirati običnu klasu koja odgovara tom protokolu i pruža implementaciju. Delimična implementacija protokola može biti pružena putem proširenja (protocol extensions), ali to ne čini protokol "apstraktnom klasom" u čistom smislu.
| Protokol (Swift) | Apstraktna klasa (tradicionalna) | |
|---|---|---|
| Svrha | Definisanje ugovora (interfejsa) | Definisanje opšteg ponašanja i strukture sa mogućnošću delimične implementacije |
| Implementacija | Obično ne sadrži implementaciju (osim proširenja) | Može sadržavati kako implementirane, tako i apstraktne metode |
| Instanciranje | Nije moguće kreirati instancu protokola | Nije moguće direktno kreirati instancu apstraktne klase |
| Nasleđivanje | Sklapanje sa protokolom (conformance) | Nasleđivanje (inheritance) |
| Višestruko nasleđivanje | Tip može odgovarati više protokolima | Klasa može nasleđivati samo od jedne klase (u većini jezika) |
| U Swiftu | Glavni oblik apstrakcije | Nema direktnog ekvivalenta, imitira se putem protokola i klasa |
Primer imitacije apstraktne klase pomoću protokola i klase u Swiftu:
Protokol koji definiše apstraktne zahteve:
// Protokol, kao ugovor
protocol Drawable {
func draw()
var color: String { get set }
}
Klasa koja odgovara protokolu i pruža implementacije:
// Klasa koja implementira protokol
class Circle: Drawable {
var color: String
init(color: String) {
self.color = color
}
func draw() {
print("Crta krug boje \(color)")
}
}
Proširenje za pružanje podrazumevane delimične implementacije:
// Proširenje za pružanje podrazumevane implementacije (ne čini protokol apstraktnom klasom)
extension Drawable {
func draw() {
print("Počinje da crta nešto boje \(color)")
}
}
Na ovaj način, u Swiftu, protokoli igraju ključnu ulogu u postizanju polimorfizma i apstrakcije, zamenjujući koncept apstraktnih klasa iz drugih jezika.