Eu porto uma quantidade razoável de código de uma plataforma que suporta classes base abstratas para o Swift e me deparo muito com isso. Se o que você realmente deseja é a funcionalidade de uma classe base abstrata, isso significa que essa classe serve tanto como uma implementação da funcionalidade de classe baseada em compartilhamento (caso contrário, seria apenas uma interface / protocolo) E define métodos que devem ser implementados por classes derivadas.
Para fazer isso no Swift, você precisará de um protocolo e uma classe base.
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
Observe que a classe base implementa o (s) método (s) compartilhado (s), mas não implementa o protocolo (uma vez que não implementa todos os métodos).
Então, na classe derivada:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
A classe derivada herda sharedFunction da classe base, ajudando-a a satisfazer essa parte do protocolo, e o protocolo ainda exige que a classe derivada implemente abstractFunction.
A única desvantagem real desse método é que, como a classe base não implementa o protocolo, se você tiver um método da classe base que precise acessar uma propriedade / método do protocolo, será necessário substituí-lo na classe derivada e, a partir daí, chamar a classe base (via super) passando self
para que a classe base tenha uma instância do protocolo com o qual realizar seu trabalho.
Por exemplo, digamos que sharedFunction necessário para chamar abstractFunction. O protocolo permaneceria o mesmo e as classes agora pareceriam:
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");
}
}
Agora, o sharedFunction da classe derivada está satisfazendo essa parte do protocolo, mas a classe derivada ainda é capaz de compartilhar a lógica da classe base de uma maneira razoavelmente direta.