Sobes.tech
Middle

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.