Как применить переопределение для большого дочернего класса в Swift? - PullRequest
1 голос
/ 10 февраля 2020

У меня ниже иерархические отношения наследования в Swift,

class Base {

    func method1() { }
    func method2() { }
}

class Child: Base {

    override func method1() { }
    func method3() { }
}

class GrandChild: Child {

}

Теперь я хочу принудительно GrandChild переопределить method1() из Base класса и method3() из Child класса. Как я могу это сделать? Любой обходной путь или лучший подход?

1 Ответ

1 голос
/ 10 февраля 2020

Нет способа сделать это во время компиляции в Swift. Функция принудительного переопределения метода отсутствует в Swift.

Но есть обходной путь.

Это можно сделать, поставив фатальную ошибку fatalError("Must Override").

Рассмотрим следующий пример.

class Base {
    func method1() {
      fatalError("Must Override")
    }
    func method2() { }
}

class Child: Base {
    override func method1() { }
    func method3() {
      fatalError("Must Override")
    }
}

class GrandChild: Child {
   func method1() { }
   func method3() { }
}

Но приведенный выше метод не даст никаких ошибок во время компиляции. Для этого есть другой обходной путь.

Вы можете создать протокол.

protocol ViewControllerProtocol {
   func method1()
   func method3()
}

typealias ViewController = UIViewController & ViewControllerProtocol

Поэтому, если вы реализуете этот протокол и не реализуете методы, компилятор выдаст ошибку.

В качестве функции протоколов в Swift вы также можете предоставить реализацию методов по умолчанию в расширении протокола.

Надеюсь, это поможет.

...