Przenoszę sporą ilość kodu z platformy obsługującej abstrakcyjne klasy bazowe do Swift i często z tym korzystam. Jeśli to, czego naprawdę chcesz, to funkcjonalność abstrakcyjnej klasy bazowej, oznacza to, że ta klasa służy zarówno jako implementacja funkcjonalności współdzielonej klasy bazowej (w przeciwnym razie byłby to tylko interfejs / protokół) ORAZ definiuje metody, które muszą być implementowane przez klasy pochodne.
Aby to zrobić w Swift, będziesz potrzebować protokołu i klasy bazowej.
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
Należy zauważyć, że klasa bazowa implementuje metody współdzielone, ale nie implementuje protokołu (ponieważ nie implementuje wszystkich metod).
Następnie w klasie pochodnej:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
Klasa pochodna dziedziczy sharedFunction z klasy bazowej, pomagając spełnić tę część protokołu, a protokół nadal wymaga klasy pochodnej do zaimplementowania abstractFunction.
Jedynym prawdziwym minusem tej metody jest to, że ponieważ klasa bazowa nie implementuje protokołu, jeśli masz metodę klasy bazowej, która wymaga dostępu do właściwości / metody protokołu, będziesz musiał przesłonić ją w klasie pochodnej, a stamtąd wywołać przekazywanie klasy bazowej (przez super), self
tak aby klasa bazowa miała instancję protokołu, z którym ma wykonywać swoją pracę.
Na przykład powiedzmy, że sharedFunction wymagało wywołania abstractFunction. Protokół pozostałby taki sam, a klasy wyglądałyby teraz następująco:
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");
}
}
Teraz sharedFunction z klasy pochodnej spełnia tę część protokołu, ale klasa pochodna nadal jest w stanie współużytkować logikę klasy bazowej w dość prosty sposób.