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

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

概述我有一个协议,其中定义了一个函数,函数的返回类型是SuperclassType. 在符合协议的类中,我试图定义此函数,但使用SubclassType返回类型. 编译器告诉我,这个类不符合协议,因为显然SubclassType!= SuperclassType protocol SomeProtocol { func someFunction(someParameter:SomeType) -> 我有一个协议,其中定义了一个函数,函数的返回类型是Superclasstype.

在符合协议的类中,我试图定义此函数,但使用Subclasstype返回类型.

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

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

但是,常识告诉我,在这个问题上,Subclasstype应该是Superclasstype的合适替代品.

我究竟做错了什么?

谢谢.

解决方法 在你走得更远之前,我建议在 covariance vs contravariance和 Liskov substitution principle上阅读一些背景资料.

>当子类化是协变时重写的方法的返回类型:方法的子类重写可以返回超类方法的返回类型的子类型.
>通用类型参数是不变的:专业化既不能缩小也不能扩展类型要求.

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

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

protocol SomeProtocol {    typealias ReturnType: Superclasstype    func someFunction(someParameter: SomeType) -> ReturnType}class SomeClass : SomeProtocol {    func someFunction(someParameter: SomeType) -> Subclasstype { /*...*/ }}

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

总结

以上是内存溢出为你收集整理的Swift:如何使Subclass返回类型的函数符合协议,其中Superclass被定义为返回类型?全部内容,希望文章能够帮你解决Swift:如何使Subclass返回类型的函数符合协议,其中Superclass被定义为返回类型?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1009710.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存