Swift 继承函数 return 类型不能是子类型
Swift inheritance function return type can't be sub-type
考虑以下代码:
class A {}
class B: A {}
protocol P {
var a: A {get}
}
class P1: P {
let a: A = B() // No problem
}
class P2: P {
let a: B = B() // Can't compile!!
}
因为 B
是 A
的子 class,为什么我们不能将 B
作为 var a
的 return 类型?
class A {}
class B: A {}
protocol P {
var a: A {get}
}
class P1: P {
let a: A = B() // No problem
}
class P1x: P {
let a = A() // No problem
}
class P1y: P {
var a = A()
let b: B = B() // No problem
}
现在你的困惑点:
class P2: P {
let a: B = B() // Can't compile!
}
因为a属于类型A而不是协议B中声明的B!
你不能那样做,因为 P
协议特别要求符合 class 的 属性 类型为 A
.
您始终可以在协议中使用 associatedtype
和泛型:
class A {}
class B: A {}
protocol P {
associatedtype T: A
var a: T { get }
}
class P1: P {
let a: A = B()
}
class P2: P {
let a: B = B()
}
不过请记住,如果这样做,您不能将 P
协议直接用作类型,而只能与泛型一起使用:
考虑以下代码:
class A {}
class B: A {}
protocol P {
var a: A {get}
}
class P1: P {
let a: A = B() // No problem
}
class P2: P {
let a: B = B() // Can't compile!!
}
因为 B
是 A
的子 class,为什么我们不能将 B
作为 var a
的 return 类型?
class A {}
class B: A {}
protocol P {
var a: A {get}
}
class P1: P {
let a: A = B() // No problem
}
class P1x: P {
let a = A() // No problem
}
class P1y: P {
var a = A()
let b: B = B() // No problem
}
现在你的困惑点:
class P2: P {
let a: B = B() // Can't compile!
}
因为a属于类型A而不是协议B中声明的B!
你不能那样做,因为 P
协议特别要求符合 class 的 属性 类型为 A
.
您始终可以在协议中使用 associatedtype
和泛型:
class A {}
class B: A {}
protocol P {
associatedtype T: A
var a: T { get }
}
class P1: P {
let a: A = B()
}
class P2: P {
let a: B = B()
}
不过请记住,如果这样做,您不能将 P
协议直接用作类型,而只能与泛型一起使用: