Mi a különbség a protokollok és az osztályok között, amikor absztrakt osztályokról van szó?
sobes.tech MI
Válasz az MI-től
A protokollum egy szerződést határoz meg — egy követelményeket tartalmazó (módszerek, tulajdonságok, inicializálók) halmazt, amelyet egy típusnak meg kell valósítania, amely megfelel ennek a protokollnak. A protokollok nem tartalmazzák a legtöbb követelményük megvalósítását. Nem hozhatók létre példányok protokollból.
Az absztrakt osztály olyan nyelveken, mint például a Java, olyan osztályt jelent, amelyet nem lehet közvetlenül példányosítani. Tartalmazhat megvalósított módszereket (vagy tulajdonságokat), valamint absztrakt módszereket, amelyeket a leszármazott osztályoknak kell megvalósítaniuk.
Swiftben nincs hagyományos értelemben vett absztrakt osztály fogalma. Az absztrakt osztályok funkcionalitását protokollok és osztályok kombinációja valósítja meg.
Egy protokoll segítségével meghatározhatunk egy interfészt, majd létrehozhatunk egy normál osztályt, amely megfelel ennek a protokollnak és megvalósítást nyújt. A protokoll részleges megvalósítása kiterjesztésekkel (protocol extensions) történhet, de ez nem teszi a protokollt "absztrakt osztállyá" a tiszta értelemben.
| Protokoll (Swift) | Absztrakt osztály (hagyományos) | |
|---|---|---|
| Cél | Szerződés (interfész) meghatározása | Általános viselkedés és struktúra meghatározása részleges megvalósítással |
| Megvalósítás | Általában nem tartalmaz megvalósítást (kivéve kiterjesztéseket) | Tartalmazhat megvalósított és absztrakt módszereket |
| Példányosítás | Nem hozható létre példány protokollból | Nem hozható létre közvetlenül absztrakt osztály példánya |
| Öröklődés | Megfelelés a protokollnak (conformance) | Öröklődés (inheritance) |
| Többszörös öröklődés | A típus több protokollnak is megfelelhet | Az osztály csak egy osztályból örökölhet (többnyelvű környezetben) |
| Swiftben | A legfőbb absztrakciós forma | Nincs közvetlen megfelelő, protokollok és osztályok segítségével szimulálható |
Példa az absztrakt osztály szimulálására protokoll és osztály segítségével Swiftben:
A protokoll, amely meghatározza az absztrakt követelményeket:
// Protokoll, mint szerződés
protocol Drawable {
func draw()
var color: String { get set }
}
Az osztály, amely megfelel a protokollnak és megvalósítja azokat:
// Osztály, amely megvalósítja a protokollt
class Circle: Drawable {
var color: String
init(color: String) {
self.color = color
}
func draw() {
print("Kör rajzolása színnel \(color)")
}
}
Kiterjesztés az alapértelmezett részleges megvalósítás biztosítására:
// Kiterjesztés az alapértelmezett megvalósítás biztosítására (nem teszi az protokollt absztrakt osztállyá)
extension Drawable {
func draw() {
print("Valami rajzolásának kezdése színnel \(color)")
}
}
Így a Swiftben a protokollok kulcsszerepet játszanak a polimorfizmus és az absztrakció elérésében, helyettesítve más nyelvek absztrakt osztályainak fogalmát.