(在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) {}
}
我不确定这种行为是不是错误。你觉得呢?
答案 0 :(得分:0)
这不是错误。在您的第一个示例中,您的类没有完全实现PPP中的所有方法。 foobar(x: B)
与func foobar(x: A)
不同,即使您可以将B传递到func foobar(x: B)
将func foobar(x: B) {}
添加到MyClass
,但它应该有效。
答案 1 :(得分:0)
问题是第一个代码是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
。闻起来像臭虫。