给定以下具有关联类型的协议:
protocol P {
associatedtype T
func f(t: T)
}
符合协议A
的课程P
:
class A: P {
func f(t: String) {
print(t)
}
}
有没有办法在子类'B'中覆盖'P'的一致性,以便我们可以更改相关的类型'T'?
class B: A, P { // Redundant conformance of 'B' to protocol 'P'
func f(t: Int) {
super.f("Hello")
print(2 * t)
}
}
写B
符合P
是多余的并且会出错。
B将符合协议两次,即使没有子类化也是不可能的。
我可以想到这样的功能可能有用的场景。是否有任何理由不应该这样做?
修改
我要问的是,即使A
是P<T>
的子类,也有B
P<U>
和B
为A
的方法positionPerFrame
,即覆盖关联的类型。
答案 0 :(得分:0)
您的子类已经从其超类继承了协议的采用,因此不需要在子类中覆盖协议的一致性。
原因:
protocol P {
var name:String{get set}
}
class A:P {
var name:String = "Swift"
}
class B:A {
override var name:String{
get{
return "Hello"
}set{
}
}
}
将class B
符合protocol P
之后,您应该实现属性和方法。在正常情况下,编译器会警告您添加
所需的方法和属性..
但是如果在这种情况下发生这种情况,名称将与被覆盖的名称冲突。所以这不应该发生。所以你会得到编译器错误
重新符合协议