我正在尝试这种技术:
class Pet {} class Dog: Pet {} class House { func getPets() -> [Pet] { return [Pet]() } } class DogHouse: House { override func getPets() -> [Dog] { return [Dog]() } }
DogHouse类以严格满足House getPets的API要求的方式覆盖House getPets方法.
解决方法
回答官方提出的问题:是的,Swift在返回类型中允许更多“受限制”的返回类型.此属性正式称为返回类型协方差.考虑这个例子,它是可编译的Swift代码:
class Pet {} class Dog: Pet {} class House { func getPets() -> Pet { return Pet() } } class DogHouse: House { override func getPets() -> Dog { return Dog() } }
然而,这里的问题是Array< Dog>与Array< Pet>不是“更受限制”的类型,相反,Array< Pet>不是Array< Dog>的推广.形式上,Array< Dog>不是Array< Pet>的协变量.
为了说明原因,请考虑以下示例:
class House<T> { var occupants = [T]() func addOccupant(_ o: T) { occupants.append(o) } } class Pet {} class Dog: Pet {} class Cat: Pet {} class PetHouseBuilder { func buildHouse() -> House<Pet> { return House() } } class DogHouseBuilder: PetHouseBuilder { // Suppose this were legal override func buildHouse() -> House<Dog> { return House() } } // The concrete return type of the object is `House<Dog>`,but // `PetHouseBuilder.buildHouse` has a static return type of `House<Pet>`,// so `petHouse` will have an inferred static type of `House<Pet>` let petHouse = PetHouseBuilder().buildHouse() let vulnerableLittle版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。