Swift 2协议扩展没有正确调用重写方法
发布时间:2020-12-14 05:29:53 所属栏目:百科 来源:网络整理
导读:我一直在使用 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”
不幸的是,协议没有这种动态行为(尚未).
但是你可以通过在ParentClass中实现commonBehavior()并在ChildClass中覆盖它来实现(在类的帮助下).您还需要CommonThing或其他类来符合CommonTrait,它是ParentClass的超类: class CommonThing: CommonTrait {
func say() -> String {
return "override this"
}
}
class ParentClass: CommonThing {
func commonBehavior() -> String {
// calling the protocol extension indirectly from the superclass
return (self as CommonThing).commonBehavior()
}
override func say() -> String {
// if called from ChildClass the overridden function gets called instead
return commonBehavior()
}
}
class AnotherParentClass: CommonThing {
override func say() -> String {
return commonBehavior()
}
}
class ChildClass: ParentClass {
override func say() -> String {
return super.say()
}
// explicitly override the function
override func commonBehavior() -> String {
return "from child class"
}
}
let parent = ParentClass()
parentClass.say() // "from protocol extension"
let child = ChildClass()
child.say() // "from child class"
由于这只是您问题的简短解决方案,我希望它适合您的项目. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
