我有这段代码:
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!
的情况下执行此操作?
答案 0 :(得分:4)
多态性正是你如何摆脱你如此恐惧的if
和is
。事实上,这就是多态 。问题是你使用 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))
但我认为您知道这一点,而且您认为这与说is
和as
相同。