为什么带有可选参数的此方法不能覆盖基类方法?

cad*_*lue 11 swift

结果是“ 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)

编译器必须选择其中之一。并且它比没有参数的方法更喜欢没有参数的方法。


Wez*_*Wez 9

之所以得到输出,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)