3 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
簡短的答案是協(xié)議擴(kuò)展不執(zhí)行類多態(tài)性。這是有一定道理的,因?yàn)閰f(xié)議可以被結(jié)構(gòu)體或枚舉所采用,并且因?yàn)槲覀儾幌M麅H在沒有必要的地方采用協(xié)議來引入動(dòng)態(tài)調(diào)度。
因此,在中g(shù)etColor(),color實(shí)例變量(可能更準(zhǔn)確地寫為self.color)并不意味著您認(rèn)為它會(huì)做什么,因?yàn)槟谝灶惗鄳B(tài)的方式思考,而協(xié)議不是。所以這工作:
let colorB = B().color // is "Red color" - OK
...因?yàn)槟屢活悓W(xué)生解決問題color,但這并不能滿足您的期望:
let b = B().getColor() // is "Default color" BUT I want it to be "Red color"
...因?yàn)樵揼etColor方法完全在協(xié)議擴(kuò)展中定義。您可以通過getColor在B中重新定義來解決此問題:
class B: A, RedColor {
func getColor() -> String {
return self.color
}
}
現(xiàn)在,該類的getColor被調(diào)用了,它對什么self是一個(gè)多態(tài)的想法。

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
我設(shè)法得到它的工作通過定義color上Color和切換執(zhí)行列表B.沒有太多的好,如果B必須是一個(gè)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)注
- 616 瀏覽
添加回答
舉報(bào)