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
}
}
我遇到了一个问题,子类的方法被调用覆盖了一个方法,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,超类版本的方法仍然被调用,而不是子类的版本,它覆盖超类的方法,应该是被调用的方法。
预期输出: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
}
}