从超类访问子类函数

时间:2018-05-04 05:35:58

标签: swift inheritance subclass 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
        } 

2 个答案:

答案 0 :(得分:0)

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

你应该做的是在超类上声明一个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
    }

答案 1 :(得分:0)

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

尽管如此,你总是可以尝试在Swift中使用东西来获取其他类的功能。

看看这个例子。这是非常基本和简单的,但我希望你明白这一点。

所以想象你有一个班级城市:

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

它是城镇的子类:

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

现在,您希望可以从buildTown()课程访问Town的City函数。因为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")
    }
}

结果,您可以从所需的任何City子类访问相同的函数并自定义行为。

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

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