Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 从超类访问子类函数_Swift_Inheritance_Subclass_Superclass - Fatal编程技术网

Swift 从超类访问子类函数

Swift 从超类访问子类函数,swift,inheritance,subclass,superclass,Swift,Inheritance,Subclass,Superclass,有没有办法从超类访问子类方法? switch语句位于超类中的函数中。createCityOne()、createCityTwo()和createCityThree()等函数都在各自的子类中 if transitionSprite.name == nil || transitionSprite.name == "rd-d2c" || transitionSprite.name == "rd-f2c" || transitionSprite.name == "rd-c2c" {

有没有办法从超类访问子类方法? switch语句位于超类中的函数中。createCityOne()、createCityTwo()和createCityThree()等函数都在各自的子类中

    if transitionSprite.name == nil || transitionSprite.name == "rd-d2c" || transitionSprite.name == "rd-f2c" || transitionSprite.name == "rd-c2c" {
        print("city should come next")
        switch randomIndex {
        case 0:
            cityOne.createCityOne()
            print("1")
        case 1:
            cityTwo.createCityTwo()
            print("2")
        case 2:
            print("3")
            cityThree.createCityThree()
        default:
            break
        } 

一个超类应该根本不知道任何子类。它当然不应该知道特定于子类的函数

您应该做的是在超类上声明一个
createCity
函数。然后,每个子类都应该重写这个函数来执行子类需要执行的任何操作

那么您的代码很简单:

if transitionSprite.name == nil || transitionSprite.name == "rd-d2c" || transitionSprite.name == "rd-f2c" || transitionSprite.name == "rd-c2c" {
    print("city should come next")
    switch randomIndex {
    case 0:
        cityOne.createCity()
        print("1")
    case 1:
        cityTwo.createCity()
        print("2")
    case 2:
        print("3")
        cityThree.createCity()
    default:
        break
    }

您不能直接从超类访问子类方法,因为超类对自己的子类一无所知

尽管如此,您仍然可以尝试在Swift中将内容转换为其他类的功能

看看这个例子。这是非常基本和简单,但我希望你得到的想法

假设你有一个一流的城市:

class City {
    func build() {
        print("city is building")
}
这是小镇的子类:

class Town: City {
    func buildTown() {
        print("town is building")
    }
}
现在,您需要从
City
类访问Town的
buildTown()
函数。因为
Town
始终是
City
的子类,所以您可以创建如下内容:

class City {
    func build() {
        print("city is building")
    }

    func buildAnything() {
        if self is Town {
            (self as! Town).buildTown()
        }
    }
}
现在我并不是说你真的想创建这样的东西,因为你可以通过这种方式将子类的逻辑暴露给超类。因此,解决这个问题的一个好方法是只创建一个
build()
函数,然后重写它

class City {
    func build() {
        print("city is building")
    }
}

class Town: City {
    override func build() {
        print("town is building")
    }
}
因此,您可以从所需的任何城市子类访问相同的函数,并自定义行为

let myTown = Town()
let myCity = City()
myCity.build() //prints "city is building"
myTown.build() //prints "town is building"
好的解决方案始终取决于您的确切目标,因此请始终查看语言提供的许多选项。更多关于继承