繁体   English   中英

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

[英]Swift: How can I make a function with a Subclass return type conform to a protocol, where a Superclass is defined as a return type?

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

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

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

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

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

class SubclassType : SuperclassType { }

不过,常识告诉我,在这件事上, SubclassType应该是SuperclassType的合适替代品。

我究竟做错了什么?

谢谢。

在你更进一步之前,我建议你阅读一些关于协变与逆变Liskov 替换原则的背景阅读。

  • 子类化协变覆盖的方法的返回类型:方法的子类覆盖可以返回超类方法的返回类型的类型。

  • 泛型类型参数是不变的:特化既不能缩小也不能扩展类型要求。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM