Расширение протокола Swift 2 неправильно вызывает переопределенный метод

Я столкнулся с проблемой использования протоколов Swift 2 с реализациями по умолчанию. Основная суть в том, что я предоставил реализацию протокола по умолчанию, которую я переопределяю в классе, который реализует протокол. Этот метод расширения протокола вызывается из базового класса, который затем вызывает метод, который я переопределил в производном классе. В результате переопределенный метод не вызывается.

Я попытался отогнать проблему до минимально возможной игровой площадки, которая иллюстрирует проблему ниже.

protocol CommonTrait: class {
    func commonBehavior() -> String
}

extension CommonTrait {
    func commonBehavior() -> String {
        return "from protocol extension"
    }
}

class CommonThing {
    func say() -> String {
        return "override this"
    }
}

class ParentClass: CommonThing, CommonTrait {
    override func say() -> String {
        return commonBehavior()
    }
}

class AnotherParentClass: CommonThing, CommonTrait {
    override func say() -> String {
        return commonBehavior()
    }
}

class ChildClass: ParentClass {
    override func say() -> String {
        return super.say()
        // it works if it calls `commonBehavior` here and not call `super.say()`, but I don't want to do that as there are things in the base class I don't want to have to duplicate here.
    }
    func commonBehavior() -> String {
        return "from child class"
    }
}

let child = ChildClass()
child.say() // want to see "from child class" but it's "from protocol extension”

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

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