【问题标题】:accessing a subclass function from a superclass从超类访问子类函数
【发布时间】:2018-10-14 12:33:12
【问题描述】:

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

【问题讨论】:

    标签: swift inheritance subclass superclass


    【解决方案1】:

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

    尽管如此,您始终可以尝试在 Swift 中将事物转换为事物以获取其他类的功能。

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

    假设你有一个类 City:

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

    它是 Town 的子类:

    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")
        }
    }
    

    因此,您可以从任何您想要的 City 子类访问相同的函数并自定义行为。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-05-24
        • 2013-03-24
        • 2017-09-13
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-10
        • 1970-01-01
        相关资源
        最近更新 更多