函数重载与swift中的子类

时间:2016-12-10 15:45:12

标签: swift swift3

我有这段代码:

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 : A)函数时,它会调用action(_ param : B)

是否可以在不使用is / as!的情况下执行此操作?

1 个答案:

答案 0 :(得分:4)

多态性正是你如何摆脱你如此恐惧的ifis。事实上,这就是多态 。问题是你使用 word “polymorphic”,但你忘了使用多态。实际上,代码中存在 no 多态性。多态意味着每个类或子类为自己行动。因此:

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相同。