Я переношу изрядное количество кода с платформы, которая поддерживает абстрактные базовые классы, на Swift и часто использую его. Если то, что вы действительно хотите, - это функциональность абстрактного базового класса, то это означает, что этот класс служит как реализацией функциональности общего класса (в противном случае это был бы просто интерфейс / протокол), И он определяет методы, которые должны быть реализованы производные классы.
Для этого в Swift вам понадобится протокол и базовый класс.
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
Обратите внимание, что базовый класс реализует общие методы, но не реализует протокол (поскольку он не реализует все методы).
Затем в производном классе:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
Производный класс наследует sharedFunction от базового класса, помогая ему удовлетворить эту часть протокола, и протокол по-прежнему требует, чтобы производный класс реализовал abstractFunction.
Единственный реальный недостаток этого метода заключается в том, что, поскольку базовый класс не реализует протокол, если у вас есть метод базового класса, которому требуется доступ к свойству / методу протокола, вам придется переопределить его в производном классе и оттуда вызвать передача базового класса (через super), self
чтобы у базового класса был экземпляр протокола, с которым он мог бы выполнять свою работу.
Например, допустим, что sharedFunction необходимо вызвать abstractFunction. Протокол останется прежним, а классы теперь будут выглядеть так:
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");
}
}
Теперь sharedFunction из производного класса удовлетворяет эту часть протокола, но производный класс по-прежнему может совместно использовать логику базового класса достаточно простым способом.