从超类访问子类函数

accessing a subclass function from a superclass

有没有办法从超类访问子类方法? 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
    }

您不能直接从 superclass 访问 subclass 方法,因为 superclass 对它自己的 subclass 方法一无所知。

尽管如此,您始终可以尝试将事物转换为 Swift 中的事物以获得其他 class.

的功能

看看这个例子。它非常基础和简单,但我希望你能理解。

假设您有一个 class 城市:

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

它是子class城镇:

class Town: City {
    func buildTown() {
        print("town is building")
    }
}

现在您想从 City class 访问 Town 的 buildTown() 功能。因为 Town 永远是 City 因为它是子 class 你可以创建这样的东西:

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

    func buildAnything() {
        if self is Town {
            (self as! Town).buildTown()
        }
    }
}

现在我并不是说您真的想要创建这样的东西,因为您以这种方式将子class 的逻辑暴露给超级class。所以解决这个问题的一个好方法是只创建一个 build() 函数然后覆盖它。

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

class Town: City {
    override func build() {
        print("town is building")
    }
}

因此,您可以从您想要的任何城市子class访问相同的功能并自定义行为。

let myTown = Town()
let myCity = City()
myCity.build() //prints "city is building"
myTown.build() //prints "town is building"

好的解决方案始终取决于您的确切目标,因此请始终查看语言提供的许多选项。更多关于继承 here.