Kāda ir atšķirība starp protokoliem un klasēm, kad runa ir par abstraktām klasēm?
sobes.tech AI
Atbilde no AI
Protokols nosaka līgumu — prasību kopumu (metodes, īpašības, inicializētājus), kurus jāievieš atbilstošam tipam, kas atbilst šim protokolam. Protokoliem nav lielākās daļas prasību realizācijas. Protokola eksemplāru nevar izveidot.
Abstrakts klases jēdziens, atšķirībā no Swift (piemēram, Java), ir klases, kuru tieši nevar instancēt. Tā satur gan realizētās metodes (vai īpašības), gan abstraktas metodes, kuras jārealizē tās apakšklasēs.
Swift nav tradicionālās abstraktu klasu jēdziena. Abstraktu klases funkcionalitāte Swift tiek sasniegta ar protokolu un klasu kombināciju.
Izmantojot protokolu, var noteikt interfeisu, pēc tam izveidot parastu klasi, kas atbilst šim protokolam un nodrošina realizāciju. Daļa protokola realizācijas var tikt nodrošināta ar paplašinājumiem (protocol extensions), bet tas nepadara protokolu par "abstraktu klasi" pilnībā.
| Protokols (Swift) | Abstrakta klase (tradicionāla) | |
|---|---|---|
| Mērķis | Līguma (interfeisa) definēšana | Kopējas uzvedības un struktūras definēšana ar iespēju daļēji realizēt |
| Realizācija | Parasti nesatur realizāciju (izņemot paplašinājumus) | Var saturēt gan realizētas, gan abstraktas metodes |
| Instancēšana | Nav iespējams izveidot protokola eksemplāru | Nav iespējams izveidot abstraktās klases eksemplāru tieši |
| Mantošana | Atbilstība protokolam (conformance) | Mantošana (inheritance) |
| Daudzveidība | Tips var atbilst vairākām protokoliem | Klase var mantoēt tikai no viena klases (lielākajā daļā valodu) |
| Swift | Galvenā abstrakcijas forma | Nav tiešas ekvivalenta, imitē ar protokoliem un klasēm |
Piemērs, kā imitēt abstraktu klasi ar protokolu un klasi Swift:
Protokols, kas definē abstraktās prasības:
// Protokols kā līgums
protocol Drawable {
func draw()
var color: String { get set }
}
Klase, kas atbilst protokolam un nodrošina realizāciju:
// Klase, kas realizē protokolu
class Circle: Drawable {
var color: String
init(color: String) {
self.color = color
}
func draw() {
print("Zīmē riņķi ar krāsu \(color)")
}
}
Paplašinājums, kas nodrošina daļēju noklusējuma realizāciju:
// Paplašinājums, kas nodrošina noklusējuma realizāciju (nepadara protokolu par abstraktu klasi)
extension Drawable {
func draw() {
print("Sākam zīmēt kaut ko ar krāsu \(color)")
}
}
Tādējādi Swift protokoli spēlē galveno lomu polimorfisma un abstrakcijas sasniegšanā, aizstājot abstraktu klasu jēdzienu citās valodās.