可以做到这一点
相同
我有此代码:
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!
?
多态性正是您摆脱如此恐惧的if
和is
的方式。实际上,这就是多态性是。问题是您使用 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))
,但我认为您知道这一点,并且您认为这与说is
和as
。