Swift:如何使Subclass返回类型的函数符合协议,其中Superclass被定义为返回类型?

nik*_*ans 4 oop protocols swift

我有一个协议,其中定义了一个函数,函数的返回类型是a SuperclassType.

在符合协议的类中,我试图定义此函数,但具有SubclassType返回类型.

编译器告诉我,这个类不符合协议,因为很明显SubclassType!=SuperclassType

protocol SomeProtocol {
  func someFunction(someParameter:SomeType) -> SuperclassType?
}

class SomeClass : SomeProtocol {
  func someFunction(someParameter:SomeType) -> SubclassType? {
    ...
  }
}

class SubclassType : SuperclassType { }
Run Code Online (Sandbox Code Playgroud)

但是,常识告诉我,这SubclassType应该是一个合适的替代品SuperclassType.

我究竟做错了什么?

谢谢.

ric*_*ter 10

在你走得更远之前,我建议一些关于协方差与逆变Liskov替换原理的背景阅读.

  • 返回类型的方法子类时覆盖协变:一个方法的子类覆盖可以返回一个亚型的超类方法的返回类型.

  • 通用类型参数是不变的:专业化既不能缩小也不能扩展类型要求.

协议和采用它的具体类型之间的关系更像是泛型而不是子类化,因此协议中声明的返回类型也是不变的.(在第一次阅读时很难确切地说出原因.可能是存在主义与仅限制约束的协议?)

但是,您可以通过指定关联的类型要求来允许协议中的协方差:

protocol SomeProtocol {
    typealias ReturnType: SuperclassType
    func someFunction(someParameter: SomeType) -> ReturnType
}

class SomeClass : SomeProtocol {
    func someFunction(someParameter: SomeType) -> SubclassType { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)

现在,很明显someFunction采用的类型的返回类型SomeProtocol必须是其SuperclassType子类型或其子类型.