【发布时间】:2016-04-26 23:40:23
【问题描述】:
我为 Alamofire 的可访问性实现了一个小包装器。现在我遇到了一个子类没有收到通知的问题。
正如评论中添加的 dfri,问题可以描述为 如果将子类实例调用的超类方法放在扩展中,则看不到被覆盖的子类方法。
感谢他出色的要点展示了通常的 foo/bar 的可重现问题:https://gist.github.com/dfrib/01e4bf1020e2e39dbe9cfb14f4165656
协议和扩展逻辑:
protocol ReachabilityProtocol: class {
func reachabilityDidChange(online: Bool)
}
extension ReachabilityProtocol {
func configureReachabilityManager() {
// triggered externally:
rechabilityManager?.listener = { [weak self] status in
self?.reachabilityDidChange(online)
}
}
func reachabilityDidChange(online: Bool) {
// abstract, implement in subclasses
}
}
现在ViewControllerA采用了这个协议并实现了方法:
class A: UIViewController, ReachabilityProtocol {
func reachabilityDidChange(online: Bool) {
debugPrint("123")
}
}
工作到这里,打印123。
ViewController B 是一个子类,并覆盖来自 A 的方法:
class B: A {
override func reachabilityDidChange(online: Bool) {
super.reachabilityDidChange(online)
debugPrint("234")
}
}
也在工作。现在打印234 和123 通知。
现在棘手的部分是,在构建代码方面,被覆盖的方法被移动到 B 内部的一个自己的扩展中(与类 B 相同的 swift 文件):
class B: A {
...
}
// MARK: - Reachability Notification
extension B {
override func reachabilityDidChange(online: Bool) {
super.reachabilityDidChange(online)
debugPrint("234")
}
}
现在 B 的 reachabilityDidChange() 不再被调用。输出只是123。
为了检查逻辑,我什至尝试删除 override 关键字:编译器立即抱怨需要它。
所以我可以说调用层次结构是正确的。可见性。
假设:如果被覆盖的方法被放入它自己的扩展中,它就不再可见/不被调用,但编译器仍然需要 override 关键字。
那是我还没有遇到过的事情,或者是我今天在同一个项目上努力工作..
有什么提示吗?
【问题讨论】: