【问题标题】:Swift calling subclass's overridden method from superclassSwift 从超类调用子类的重写方法
【发布时间】:2015-08-19 21:28:03
【问题描述】:

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

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

【问题讨论】:

  • 调用 touchesBegan 的对象的类是什么?是 SubclassViewController 还是 ViewController?
  • 哇,我觉得自己很愚蠢。我从未将故事板中的初始视图控制器更改为 SubclassViewController。谢谢。将您的评论作为答案。
  • 我实际上在超类、ios 10、Xcode 8 中看到了选择器的这个问题

标签: swift inheritance polymorphism subclassing


【解决方案1】:

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

【讨论】:

  • 谢谢 Mike,这个功能真的很蠢!从 ObjC 转换后简直不敢相信!怎么这么快..
【解决方案2】:

确保对象的类是SubclassViewController。否则,它不会知道被子类覆盖的方法

【讨论】:

    【解决方案3】:

    我刚刚在 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
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 2012-11-25
      • 2011-10-24
      • 2012-04-18
      相关资源
      最近更新 更多