3 回答
TA貢獻(xiàn)1812條經(jīng)驗 獲得超5個贊
簡短的答案是協(xié)議擴展不執(zhí)行類多態(tài)性。這是有一定道理的,因為協(xié)議可以被結(jié)構(gòu)體或枚舉所采用,并且因為我們不希望僅在沒有必要的地方采用協(xié)議來引入動態(tài)調(diào)度。
因此,在中g(shù)etColor(),color實例變量(可能更準(zhǔn)確地寫為self.color)并不意味著您認(rèn)為它會做什么,因為您正在以類多態(tài)的方式思考,而協(xié)議不是。所以這工作:
let colorB = B().color // is "Red color" - OK
...因為您要讓一類學(xué)生解決問題color,但這并不能滿足您的期望:
let b = B().getColor() // is "Default color" BUT I want it to be "Red color"
...因為該getColor方法完全在協(xié)議擴展中定義。您可以通過getColor在B中重新定義來解決此問題:
class B: A, RedColor {
func getColor() -> String {
return self.color
}
}
現(xiàn)在,該類的getColor被調(diào)用了,它對什么self是一個多態(tài)的想法。
TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊
我設(shè)法得到它的工作通過定義color上Color和切換執(zhí)行列表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 關(guān)注
- 643 瀏覽
添加回答
舉報
