在Swift中与子类功能过载



我有此代码:

class A {
}
class B : A {
}
class Example {
    func action(_ param : A) -> String {
        return "A"
    }
    func action(_ param : B) -> String {
        return "B"
    }
    func test() -> String {
        let t : A = B()
        return self.action(t) // returns A
    }
}

我正在传递B对象,但被施放为A,因此当我希望调用action(_ param : B)函数时,它将调用action(_ param : A)

不使用is/as!

可以做到这一点

多态性正是您摆脱如此恐惧的ifis的方式。实际上,这就是多态性。问题是您使用 word "多态",但忘记了使用。实际上,您的代码中存在多态性。多态性意味着每个类别或子类对自己起作用。因此:

class A {
    func who() -> String {return "A"}
}
class B : A {
    override func who() -> String {return "B"}
}
class Example {
    func action(_ param : A) -> String {
        return param.who()
    }
    func test() -> String {
        let t : A = B()
        return self.action(t) // returns B
    }
}

替代方法是说例如

return String(describing:type(of:param))

,但我认为您知道这一点,并且您认为这与说isas

相同

最新更新