Swift 从超类访问子类函数
有没有办法从超类访问子类方法? switch语句位于超类中的函数中。createCityOne()、createCityTwo()和createCityThree()等函数都在各自的子类中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" {
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"
好的解决方案始终取决于您的确切目标,因此请始终查看语言提供的许多选项。更多关于继承