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