【问题标题】:Overriden method not called? [duplicate]未调用覆盖的方法? [复制]
【发布时间】:2016-12-24 02:53:21
【问题描述】:

B 类是 A 类的子类(B : A)

我将类初始化为B.init()

在 A 中调用时,除非我使用强制转换,否则永远不会调用被覆盖的 method():

class A {
    ...
    self.method() //A method called
    (self as! B).method() //B method called
}

为什么?

由于我将实例初始化为 B,我希望它调用被覆盖的方法,但事实并非如此,除非我使用强制转换。

【问题讨论】:

标签: swift


【解决方案1】:

我认为你在幕后犯了一些错误。我构建了您的示例,它按预期工作:

class A {
    func method() {
        print("A")
    }
    func check() {
        method()
        (self as? B)?.method()
    }
}
class B: A {
    override func method() {
        print("B")
    }
}

其他地方:

let b = B()
b.check()
//B
//B

【讨论】:

  • 扩展中的@Patrick 声明不能覆盖,所以这听起来很奇怪。
  • @Patrick 如果您的类继承自 NSObject,请参阅 stackoverflow.com/questions/38213286/… - 否则它不应该编译,因为您无法覆盖扩展中的方法。
  • @Patrick 这是一个非一般的 Swift 案例;以供将来参考,请在您的问题中提及此类(相关)细节。无论如何,有了这些额外的细节,Hamish 提供的链接应该是欺骗标记此线程的目标。
  • @dfri 我不确定我是否理解你的意思;)我已经阅读了你提到的所有文档。我在社区中提出了一个问题,因为我无法找到解决问题的方法。 Hamish 给了我一个链接(由于其他人的帮助,我没有对我的问题进行进一步调查,我找不到该链接)。当然,如果我事先想到了所有细节,我会写下来,但我没有考虑它们。这就是像 Stack Overflow 这样的社区有用的地方。不是吗? :)
  • @Patrick 我之前的评论的意思是 “别担心,找到可能回答一个人的问题的现有 SO 线程可能很难,而且还要向所有人提出一个完美的问题必要的(但不是多余的)细节!请带上对 Obj-C/Swift 特性的洞察力,因为它们会在这里和那里出现一点点!”,绝不是批评这个问题。但也许评论有点冗长,“别担心”的意图丢失了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
相关资源
最近更新 更多