Swift 从超类调用子类的重写方法

Swift calling subclass's overridden method from superclass

我遇到了一个问题,子类的方法被调用覆盖了一个方法,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,超类版本的方法仍然被调用,而不是子类的版本,它覆盖超类的方法,应该是被调用的方法。

预期输出: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")
    }
}

确保对象的 class 是 SubclassViewController。否则,它不会知道被 subclass

覆盖的方法

同样值得检查的是您没有尝试在扩展中覆盖。由于某种原因,无法在扩展中完成覆盖。

我刚刚在 Xcode 8.1 / Swift 3.0

中偶然发现了这个问题

我创建了一个带有方法存根的超级 class,目的是在我的子 class 中覆盖它,但是从超级调用它,令我惊讶的是没有调用覆盖.

我解决这个问题的方法是创建一个协议。使用 OP 的示例,我的解决方案如下所示:

超级:

class ViewController: UIViewController
{
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
    {
        foo()
    }

}

子class:

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
   }
}