Ich portiere eine ganze Menge Code von einer Plattform, die abstrakte Basisklassen unterstützt, nach Swift und laufe viel darauf ein. Wenn Sie wirklich die Funktionalität einer abstrakten Basisklasse wünschen, bedeutet dies, dass diese Klasse sowohl als Implementierung einer gemeinsam genutzten basierten Klassenfunktionalität dient (andernfalls wäre es nur eine Schnittstelle / ein Protokoll), als auch Methoden definiert, die von implementiert werden müssen abgeleitete Klassen.
Dazu benötigen Sie in Swift ein Protokoll und eine Basisklasse.
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
Beachten Sie, dass die Basisklasse die gemeinsam genutzten Methoden implementiert, das Protokoll jedoch nicht implementiert (da nicht alle Methoden implementiert werden).
Dann in der abgeleiteten Klasse:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
Die abgeleitete Klasse erbt sharedFunction von der Basisklasse, wodurch dieser Teil des Protokolls erfüllt wird, und das Protokoll erfordert weiterhin, dass die abgeleitete Klasse abstractFunction implementiert.
Der einzige wirkliche Nachteil dieser Methode besteht darin, dass Sie, da die Basisklasse das Protokoll nicht implementiert, eine Basisklassenmethode, die Zugriff auf eine Protokolleigenschaft / -methode benötigt, diese in der abgeleiteten Klasse überschreiben und von dort aus aufrufen müssen Die Basisklasse (über Super) wird übergeben, self
sodass die Basisklasse eine Instanz des Protokolls hat, mit dem sie ihre Arbeit erledigen kann.
Angenommen, sharedFunction muss abstraktFunction aufrufen. Das Protokoll würde gleich bleiben und die Klassen würden nun so aussehen:
class BaseThing
{
func sharedFunction(thing: Thing)
{
println("All classes share this implementation")
thing.abstractFunction()
}
}
class DerivedThing : BaseThing, Thing
{
func sharedFunction()
{
super.sharedFunction(self)
}
func abstractFunction()
{
println("Derived classes implement this");
}
}
Jetzt erfüllt die sharedFunction aus der abgeleiteten Klasse diesen Teil des Protokolls, aber die abgeleitete Klasse kann die Basisklassenlogik immer noch auf einigermaßen einfache Weise gemeinsam nutzen.