Я надсилаю велику кількість коду з платформи, яка підтримує абстрактні базові класи для 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.
Єдиним реальним недоліком цього методу є те, що оскільки базовий клас не реалізує протокол, якщо у вас є метод базового класу, який потребує доступу до властивості / методу протоколу, вам доведеться перекрити це у похідному класі, а звідти викликати базовий клас (через супер) передає 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");
}
}
Тепер спільнийFunction з похідного класу задовольняє ту частину протоколу, але похідний клас все ще може поділяти логіку базового класу досить просто.