协议方法中的返回类型协方差

sal*_*140 14 oop protocols covariance swift

为什么不快速支持协议中定义的方法中的返回类型协变?例如

class Base { }

class Derived : Base { }

protocol Requirement {
  var someVariable : Base { get }
}

struct MyStruct : Requirement{
 let someVariable : Derived
}
Run Code Online (Sandbox Code Playgroud)

编译器会发出MyStruct不符合协议要求的错误.据我所知,MyStruct满足了LSP的所有要求,所以我想知道为什么Swift中不允许这样做?

Dan*_*iel 0

想象一下你有:

var requirement: Requirement?
Run Code Online (Sandbox Code Playgroud)

并且你想分配一个类型的变量Base

let myBaseInstance = Base()
requirement.someVariable = myBaseInstance
Run Code Online (Sandbox Code Playgroud)

如果您查看您的结构,这是不可能的,因为 base 的实例不继承自Derived.

换句话说,这是不可能的(但根据协议的定义它必须是可能的):

var requirement: Requirement? = MyStruct()
requirement.someVariable = myBaseInstance //error 
Run Code Online (Sandbox Code Playgroud)

您在第 2 行收到错误,因为 someVariable 必须是 类型Derived,但只是myBaseInstance类型Base并且可能不符合Derived.