当前位置: 首页 > 知识库问答 >
问题:

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

闻人嘉悦
2023-03-14

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

预期输出: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个答案

萧远
2023-03-14

我刚刚在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
   }
}
钱哲茂
2023-03-14

同样值得检查的是,您没有试图在扩展中重写。由于某些原因,无法在扩展中执行覆盖。

公冶兴文
2023-03-14

确保对象的类是SubClass ViewController。否则,它将不知道被子类重写的方法

 类似资料:
  • 我有一个基类,它定义了类方法,用于返回用于构建服务url的各种信息。基类还定义了一个用于构建该url的实例方法。我希望基类有这个方法的默认实现,这样当我需要url不同时,我只需要在子类中重写它。我如何让这个基方法调用重写的类方法来使用子类中的类方法构建url?下面是我现在的代码,但它不起作用: 基类方法: op ationId、operationVersion和方法类型是在子类中实现的类方法,但是

  • 我正在学习java入门课程,我们刚刚开始学习继承。我正在做一项任务,要求我们创建一个具有名称和年龄的“Pet”超类;和三个子类,每个都有自己独特的特征(我选择了“狗”、“猫”和“鸟”)。在我们构建了所有这些之后,我们将创建一个主类来测试一切,这就是我遇到问题的地方。我试图为这些独特的特性调用

  • 问题内容: 我正在学习Java入门课程,我们才刚刚开始学习继承。我正在完成一项任务,要求我们创建一个具有名称和年龄的“宠物”超类。和三个子类,每个子类都有自己的独特特征(我选择了“狗”,“猫”和“鸟”)。构建完所有这些之后,我们将创建一个Main类来测试所有内容,这就是我遇到问题的地方。我试图在中调用这些独特特征的方法,但似乎只能找到超类中的方法。 这是主类: 这是我的超人 这是子类之一(它们看起

  • 问题内容: 一本书的引用: 如果要从超类的变量引用的对象中调用由子类定义的方法,该怎么办?假定SoftBall类具有一个名为BallBall类未定义的方法riseBall。如何从Ball变量中调用它?一种方法是创建子类的变量,然后使用赋值语句强制转换对象: 在上面的代码片段中,它显示了一个新的 Softball 对象,该对象正在创建并分配为对变量 b 的引用,这是完全合法的,因为类 Softbal

  • 在上面的代码片段中,它显示了一个新的Switterball对象被创建并赋值为变量b的引用,这是完全合法的,因为Switterball类是Ball类的子类。但是引号(间接地)指出,在使用该变量从垒球类调用方法之前,必须将该变量强制转换为垒球类型。为什么会这样?为什么我不能直接使用Ball类型的变量b(它包含对垒球对象的引用)来调用所需的方法?变量b已经有了对象。 (注:我已经读过这篇文章了。)

  • 您可以看到,我正在将“that”作为参数传递给PrintInfo。如果没有“that”参数,“info”将打印为“undefined”。像下面的例子一样,当从“子类”的对象调用此函数时,“this.info”是未定义的。 如何在javascript中重写和调用超类的方法,使函数能够访问类的实例变量?