Porto una buena cantidad de código desde una plataforma que admite clases base abstractas a Swift y me encuentro mucho con esto. Si lo que realmente desea es la funcionalidad de una clase base abstracta, eso significa que esta clase sirve tanto como una implementación de la funcionalidad de clase basada compartida (de lo contrario, solo sería una interfaz / protocolo) Y define métodos que deben implementarse mediante clases derivadas
Para hacer eso en Swift, necesitará un protocolo y una clase base.
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
Tenga en cuenta que la clase base implementa los métodos compartidos, pero no implementa el protocolo (ya que no implementa todos los métodos).
Luego en la clase derivada:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
La clase derivada hereda sharedFunction de la clase base, lo que le ayuda a satisfacer esa parte del protocolo, y el protocolo aún requiere que la clase derivada implemente abstractFunction.
El único inconveniente real de este método es que, dado que la clase base no implementa el protocolo, si tiene un método de clase base que necesita acceso a una propiedad / método de protocolo, tendrá que anularlo en la clase derivada, y desde allí llamar la clase base (a través de super) pasando self
para que la clase base tenga una instancia del protocolo con el que hacer su trabajo.
Por ejemplo, digamos que sharedFunction necesitaba llamar a abstractFunction. El protocolo permanecería igual y las clases ahora se verían así:
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");
}
}
Ahora, la función compartida de la clase derivada satisface esa parte del protocolo, pero la clase derivada aún puede compartir la lógica de la clase base de una manera razonablemente sencilla.