Метод Swift - класс, который должен быть переопределен подклассом

Есть ли стандартный способ создания "чистой виртуальной функции" в Swift, т.е. один, который должен быть переопределен каждым подклассом и который, если это не так, вызывает ошибку времени компиляции?

Ответ 1

Нет поддержки абстрактных классов/виртуальных функций, но в большинстве случаев вы могли бы использовать протокол:

protocol SomeProtocol {
    func someMethod()
}

class SomeClass: SomeProtocol {
    func someMethod() {}
}

Если SomeClass не реализует someMethod, вы получите эту ошибку времени компиляции:

error: type 'SomeClass' does not conform to protocol 'SomeProtocol'

Ответ 2

У вас есть два варианта:

1. Использовать протокол

Определите суперкласс как протокол вместо класса

Pro: проверка времени компиляции, если каждый "подкласс" (а не фактический подкласс) реализует требуемый метод (ы)

Con: "Суперкласс" (протокол) не может реализовать методы или свойства

2. Утверждение в супер-версии метода

Пример:

class SuperClass {
    func someFunc() {
        fatalError("Must Override")
    }
}

class Subclass : SuperClass {
    override func someFunc() {
    }
}

Pro: можно реализовать методы и свойства в суперклассе

Кон: проверка времени компиляции

Ответ 3

Еще одно обходное решение, если у вас слишком много "виртуальных" методов, заключается в том, чтобы подкласс передавал "реализации" в конструктор базового класса как объекты функции:

class MyVirtual {

    // 'Implementation' provided by subclass
    let fooImpl: (() -> String)

    // Delegates to 'implementation' provided by subclass
    func foo() -> String {
        return fooImpl()
    }

    init(fooImpl: (() -> String)) {
        self.fooImpl = fooImpl
    }
}

class MyImpl: MyVirtual {

    // 'Implementation' for super.foo()
    func myFoo() -> String {
        return "I am foo"
    }

    init() {
        // pass the 'implementation' to the superclass
        super.init(myFoo)
    }
}