Swift 2.0中的协议扩展方法调度

时间:2015-09-23 08:19:58

标签: ios xcode swift polymorphism xcode7

我遇到了有关协议方法调度的问题。

我有一个类层次结构,如下所示:

protocol E {
    func test()
}

extension E {
    func test() {
        print("jello")
    }
}

class A: E {

}

class B: A {
    func test() {
        print("hello")
    }
}

但是当我在类test的实例上调用B时,静态强制键入A,“jello”会被打印,而不是“你好”。

let b: A = B()  // prints "jello" not "hello"
b.test()

我的理解是test方法打印“jello”被“集成”到A的实例中(因为A符合E协议)。然后,我在test内部提供B的另一个实现(继承形式A)。我认为多态可以在这里工作,在test实例上调用存储在B引用中的A将打印hello。这里发生了什么?

不使用任何协议时,它完全有效:

class A {
    func test() {
        print("jello")
    }
}

class B: A {
    override func test() {
        print("hello")
    }
}

let b: A = B() // prints "hello"
b.test() 

与采用向父类添加新方法并在子类中提供新实现的协议有什么不同,而不是直接在父类中编写此方法然后在子类中重写它?

你们有解决方法吗?

2 个答案:

答案 0 :(得分:3)

闻起来像个臭虫。

我提出的唯一解决办法非常难看......

protocol E {
    func test()
}

func E_test(_s: E) {
    print("jello")
}

extension E {
    func test() { E_test(self) }
}

class A: E {
    func test() { E_test(self) }
}

class B: A {
    override func test() {
        print("hello")
    }
}

let b: A = B()
b.test()

答案 1 :(得分:1)

确实是一个错误。以下是指向它的链接:https://bugs.swift.org/browse/SR-103