3 回答

TA貢獻1812條經驗 獲得超5個贊
簡短的答案是協議擴展不執行類多態性。這是有一定道理的,因為協議可以被結構體或枚舉所采用,并且因為我們不希望僅在沒有必要的地方采用協議來引入動態調度。
因此,在中getColor(),color實例變量(可能更準確地寫為self.color)并不意味著您認為它會做什么,因為您正在以類多態的方式思考,而協議不是。所以這工作:
let colorB = B().color // is "Red color" - OK
...因為您要讓一類學生解決問題color,但這并不能滿足您的期望:
let b = B().getColor() // is "Default color" BUT I want it to be "Red color"
...因為該getColor方法完全在協議擴展中定義。您可以通過getColor在B中重新定義來解決此問題:
class B: A, RedColor {
func getColor() -> String {
return self.color
}
}
現在,該類的getColor被調用了,它對什么self是一個多態的想法。

TA貢獻1816條經驗 獲得超6個贊
我設法得到它的工作通過定義color上Color和切換執行列表B.沒有太多的好,如果B必須是一個A雖然。
protocol Color {
var color : String { get }
}
protocol RedColor: Color {
}
extension Color {
var color : String {
get {return "Default color"}
}
}
extension RedColor {
var color : String {
get {return "Red color"}
}
}
protocol PrintColor {
func getColor() -> String
}
extension PrintColor where Self: Color {
func getColor() -> String {
return color
}
}
class A : Color, PrintColor {
}
class B : RedColor, PrintColor {
}
let a = A().getColor() // "Default color"
let b = B().getColor() // "Red color"
- 3 回答
- 0 關注
- 617 瀏覽
添加回答
舉報