Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了swift – 子类是否可以覆盖函数并进行更严格的返回?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在尝试这种技术: class Pet {} class Dog: Pet {} class House { func getPets() -> [Pet] { return [Pet]() } } class DogHouse: House { override func getPets() -> [Dog] { return [D
我正在尝试这种技术:

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不理解[Dog] isa [Pet]并且它产生@L_37_1@method不会覆盖其超类中的任何方法.

对于子类来说,有什么方法可以使用比其超类更通用的输入或更多限制性输出来实现API?

解决方法

回答官方提出的问题:是的,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

大佬总结

以上是大佬教程为你收集整理的swift – 子类是否可以覆盖函数并进行更严格的返回?全部内容,希望文章能够帮你解决swift – 子类是否可以覆盖函数并进行更严格的返回?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。