我一直在使用
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"
由于这只是您问题的简短解决方案,我希望它适合您的项目.