Was ist der Unterschied zwischen Protokollen und Klassen, wenn es um abstrakte Klassen geht?
sobes.tech KI
Antwort von AI
Das Protokoll definiert einen Vertrag: eine Reihe von Anforderungen (Methoden, Eigenschaften, Initialisierer), die ein Typ erfüllen muss, der diesem Protokoll entspricht. Protokolle enthalten die meisten ihrer Anforderungen nicht in ihrer Implementierung. Es ist nicht möglich, Instanzen eines Protokolls zu erstellen.
Eine abstrakte Klasse in Sprachen außer Swift (z.B. Java) stellt eine Klasse dar, die nicht direkt instanziiert werden kann. Sie enthält sowohl implementierte Methoden (oder Eigenschaften) als auch abstrakte Methoden, die in ihren Unterklassen implementiert werden müssen.
In Swift gibt es kein Konzept von abstrakten Klassen im traditionellen Sinne. Die Funktionalität abstrakter Klassen in Swift wird durch eine Kombination aus Protokollen und Klassen erreicht.
Mit einem Protokoll kann eine Schnittstelle definiert werden, und dann kann eine normale Klasse erstellt werden, die diesem Protokoll entspricht und eine Implementierung bereitstellt. Eine teilweise Implementierung des Protokolls kann durch Erweiterungen (protocol extensions) bereitgestellt werden, aber das macht das Protokoll nicht zu einer "abstrakten Klasse" im reinen Sinne.
| Protokoll (Swift) | Abstrakte Klasse (traditionell) | |
|---|---|---|
| Zweck | Definition eines Vertrags (Schnittstelle) | Definition eines gemeinsamen Verhaltens und einer Struktur mit teilweise Implementierung |
| Implementierung | Enthält in der Regel keine Implementierung (außer Erweiterungen) | Kann sowohl implementierte als auch abstrakte Methoden enthalten |
| Instanziierung | Es ist nicht möglich, eine Instanz des Protokolls zu erstellen | Es ist nicht möglich, eine Instanz einer abstrakten Klasse direkt zu erstellen |
| Vererbung | Konformität mit dem Protokoll (conformance) | Vererbung (inheritance) |
| Mehrfachvererbung | Der Typ kann mehreren Protokollen entsprechen | Eine Klasse kann nur von einer Klasse erben (in den meisten Sprachen) |
| In Swift | Ist die Hauptform der Abstraktion | Es gibt kein direktes Äquivalent, es wird mit Protokollen und Klassen imitiert |
Beispiel für die Imitation einer abstrakten Klasse mit einem Protokoll und einer Klasse in Swift:
Protokoll, das abstrakte Anforderungen definiert:
// Protokoll, als Vertrag
protocol Drawable {
func draw()
var color: String { get set }
}
Klasse, die dem Protokoll entspricht und Implementierungen bereitstellt:
// Klasse, die das Protokoll implementiert
class Circle: Drawable {
var color: String
init(color: String) {
self.color = color
}
func draw() {
print("Zeichne Kreis mit Farbe \(color)")
}
}
Erweiterung, um eine teilweise Standardimplementierung bereitzustellen:
// Erweiterung, um eine Standardimplementierung bereitzustellen (macht das Protokoll nicht zu einer abstrakten Klasse)
extension Drawable {
func draw() {
print("Beginne, etwas mit Farbe \(color) zu zeichnen")
}
}
Auf diese Weise spielen Protokolle in Swift eine Schlüsselrolle bei der Erreichung von Polymorphismus und Abstraktion und ersetzen das Konzept abstrakter Klassen aus anderen Sprachen.