我遇到一个子类的方法被调用覆盖一个方法的问题,所以我创建了一个小应用程序来测试它。当超类调用其子类重写的方法时,仍然会调用超类的方法版本,而不是子类的版本,它会覆盖超类的方法,应该是被调用的方法。
预期输出:sub foo
实际输出:super foo
超类:
class ViewController: UIViewController
{
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
{
foo()
}
func foo()
{
println("super foo")
}
}
子类:
class SubclassViewController: ViewController
{
override func foo()
{
println("sub foo")
}
}
答案 0 :(得分:5)
您还有必要检查您是否未尝试覆盖扩展程序。由于某种原因,覆盖不能在扩展中完成。
答案 1 :(得分:4)
确保对象的课程为SubclassViewController
。否则,它将不知道由子类
答案 2 :(得分:2)
我在Xcode 8.1 / Swift 3.0中偶然发现了这个问题
我创建了一个带有方法存根的超类,意图在我的子类中覆盖它,但是从超级调用它并且令我惊讶的是,覆盖没有被调用。
我解决这个问题的方法是创建一个协议。使用OP的示例,我的解决方案如下所示:
超级:
class ViewController: UIViewController
{
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
{
foo()
}
}
子类:
class SubclassViewController: ViewController
{
override func foo()
{
println("sub foo")
}
}
协议:
protocol Fooizer {
func foo()
}
协议扩展:
extension ViewController : Fooizer{
func foo(){
abort() //If you don't override foo in your subclass, it will abort
}
}