[英]Swift - Return subclass type in overridden function of superclass
[英]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.