[英]Swift: Protocol conformance - Is this a bug or not?
(在XCode 6 beta 3上)
此代碼引發錯誤“類型MyClass不符合協議MyProtocol”。
class A {}
class B : A {}
protocol PPP {
func foobar(x: B)
}
class MyClass : PPP { // --> error: doesn't conform to PPP
func foobar(x: A) {}
}
但是,下面的代碼是可以的:
class MyClass : PPP {
func foobar(x: B) {}
}
class MySubClass : MyClass {
override func foobar(x: A) {}
}
var p:PPP = MySubClass()
當我在MySubClass上明確應用PPP時,再次引發相同的錯誤:
class MyClass : PPP {
func foobar(x: B) {}
}
class MySubClass : MyClass, PPP { // --> error: doesn't conform to PPP
override func foobar(x: A) {}
}
我不確定這種行為是不是一個bug。 你認為?
這不是一個錯誤。 在您的第一個示例中,您的類沒有完全實現PPP中的所有方法。 foobar(x: B)
與func foobar(x: A)
不同,即使你可以將B傳遞給func foobar(x: B)
將func foobar(x: B) {}
到MyClass
並且它應該可以工作。
問題是第一個代碼是PPP
協議中的方法:
func foobar(x: B)
期望收到B
的實例。 您將覆蓋指定類型A
的參數,該參數與B
不同,即使它是超類。 為了確認協議,您必須完全按照協議中聲明的方法實現。 我不認為這是一個錯誤。
更有趣的是,在最后一種情況下:
class MyClass : PPP {
func foobar(x: B) { print ("BaseB")}
}
class MySubClass : MyClass, PPP {
override func foobar(x: B) { print("B") }
}
var xx = MySubClass()
xx.foobar(B())
輸出B
,這是我所期望的。 代替:
class MyClass : PPP {
func foobar(x: B) { print ("BaseB")}
}
class MySubClass : MyClass, PPP {
override func foobar(x: A) { print("A") }
override func foobar(x: B) { print("B") }
}
var xx = MySubClass()
xx.foobar(A())
xx.foobar(B())
輸出AA
,而我期望AB
。 聞起來像臭蟲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.