Je porte une bonne quantité de code depuis une plate-forme qui prend en charge les classes de base abstraites vers Swift et j'y suis souvent connecté. Si ce que vous voulez vraiment, c'est la fonctionnalité d'une classe de base abstraite, cela signifie que cette classe sert à la fois d'implémentation de fonctionnalité de classe partagée (sinon ce serait juste une interface / protocole) ET qu'elle définit des méthodes qui doivent être implémentées par classes dérivées.
Pour ce faire dans Swift, vous aurez besoin d'un protocole et d'une classe de base.
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
Notez que la classe de base implémente la ou les méthodes partagées, mais n'implémente pas le protocole (car elle n'implémente pas toutes les méthodes).
Puis dans la classe dérivée:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
La classe dérivée hérite de sharedFunction de la classe de base, ce qui l'aide à satisfaire cette partie du protocole, et le protocole nécessite toujours que la classe dérivée implémente abstractFunction.
Le seul inconvénient réel de cette méthode est que, puisque la classe de base n'implémente pas le protocole, si vous avez une méthode de classe de base qui a besoin d'accéder à une propriété / méthode de protocole, vous devrez la remplacer dans la classe dérivée, et à partir de là, appeler la classe de base (via super) passant de self
sorte que la classe de base ait une instance du protocole avec laquelle faire son travail.
Par exemple, disons que sharedFunction avait besoin d'appeler abstractFunction. Le protocole resterait le même et les classes ressembleraient maintenant à:
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");
}
}
Maintenant, la fonction sharedFunction de la classe dérivée satisfait cette partie du protocole, mais la classe dérivée est toujours capable de partager la logique de la classe de base d'une manière raisonnablement simple.