Расширение протокола 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”