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

时间:2015-08-19 21:28:04

标签: swift inheritance polymorphism subclassing

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

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

3 个答案:

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