Быстрая отправка переопределенных методов в расширениях подкласса

переопределение сигнатур методов в расширениях в некоторых случаях может привести к непредсказуемым результатам. В следующем примере демонстрируются два разных результата с похожим шаблоном.

class A: UIViewController {
    func doThing() {
        print("dothing super class")
    }

    override func viewDidLoad() {
        print("viewdidload superclass")
        super.viewDidLoad()
    }
}

class B: A { }

extension B {
    override func doThing() {
        print("dothing sub class")
        super.doThing()
    }

    override func viewDidLoad() {
        print("viewdidload subclass")
        super.viewDidLoad()
    }
}

let a: A = B()
a.doThing()

let vc: UIViewController = B()
vc.viewDidLoad()

Это печатает:

dothing super class
viewdidload subclass
viewdidload superclass

Вы можете увидеть это пропускаетBРеализацияdoThing когда это брошено какA, однако включает в себя обе реализацииviewDidLoad когда в ролиUIViewController, Это ожидаемое поведение? Если так, то в чем причина этого?

ENV: Xcode 7.3, детская площадка

Ответы на вопрос(1)

Ваш ответ на вопрос