Swift:如何使Subclass返回类型的函数符合协议,其中Superclass被
发布时间:2020-12-14 04:47:58 所属栏目:百科 来源:网络整理
导读:我有一个协议,其中定义了一个函数,函数的返回类型是SuperclassType. 在符合协议的类中,我试图定义此函数,但使用SubclassType返回类型. 编译器告诉我,这个类不符合协议,因为显然SubclassType!= SuperclassType protocol SomeProtocol { func someFunction(so
我有一个协议,其中定义了一个函数,函数的返回类型是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或其子类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |