结果是“ a”,但我希望它是“ b”。我想知道为什么,以及如何在doTest不带参数的情况下调用以打印“ b”。
class AA {
func doTest() {
print("a")
}
}
class BB: AA {
func doTest(_ different: Bool = true) {
print("b")
}
}
let bObjc = BB()
bObjc.doTest()
Run Code Online (Sandbox Code Playgroud)
Sul*_*han 11
类BB不会覆盖from中的方法AA,这意味着存在两个方法BB:
func doTest() // inherited
func doTest(_ different: Bool = true) // declared
Run Code Online (Sandbox Code Playgroud)
你打电话的时候
bObjc.doTest()
Run Code Online (Sandbox Code Playgroud)
编译器必须选择其中之一。并且它比没有参数的方法更喜欢没有参数的方法。
之所以得到输出,a是因为您没有在调用func doTest(_ different: Bool = true)需要一个的新方法Bool。
bObjc.doTest(true) // b
Run Code Online (Sandbox Code Playgroud)
您实际上正在执行的是调用doTest()从父类继承的方法AA。
如果要覆盖其中的方法,AA则只需执行以下操作:
class BB: AA {
override func doTest() {
print("b")
}
}
let bObjc = BB()
bObjc.doTest()
Run Code Online (Sandbox Code Playgroud)