当子类中有覆盖函数时如何转换为超类

SLN*_*SLN 5 types casting class swift

创造了一辆超级轿车和一辆子级捷豹.子类中的函数info() - > Void覆盖了超类的功能.已经创建了一个名为theAuto of Jaguar的实例.

问题:

看来我不能起来铸请将auto到的类型汽车,请参阅代码片断,其意见

class Car {
        func info() {
                print("You've got a car")
        }
}

class Jaguar : Car {
       override func info() {
               print("You've got a Jaguar")
       }
}

let theAuto = Jaguar()
theAuto.info() // --> You've got a Jaguar
let auto = theAuto as Car // casting but seems not working 
auto.info() // --> You've got a Jaguar
print(type(of: auto)) // fail to casting
Run Code Online (Sandbox Code Playgroud)

题:

我想我并没有完全理解与覆盖场景一起投射的概念.为什么我不能进行投射?覆盖动作是否限制了我的上方施法?

非常感谢你的帮助和时间

Ham*_*ish 4

因为您要重写子类中的方法,所以您将获得动态调度。要调用的方法实现将基于调用它的实例的动态类型。将 a 向上转换Jaguar为 aCar只会更改实例 \xe2\x80\x93 的静态Jaguar类型,动态类型仍然是 a ,因为这就是您创建的实例的类型。

\n\n

因此,向上转换对方法 \xe2\x80\x93 的动态分派没有任何影响,也不应该有任何影响,因为动态分派的全部目的是确保调用给定实例的正确方法实现,无论它是什么\' s 静态类型为。

\n\n

您期望的行为是静态调度 \xe2\x80\x93 编译器根据实例的静态类型选择要调用的实现。这通常是通过重载(而不是覆盖)函数来实现的。

\n\n

例如,重载static方法:

\n\n
class Car {\n    static func info(for car: Car) {\n        print("You\'ve got a Car")\n    }\n}\n\nclass Jaguar : Car {\n    static func info(for jaguar: Jaguar) {\n        print("You\'ve got a Jaguar")\n    }\n}\n\nlet jaguar = Jaguar()\nJaguar.info(for: jaguar) // You\'ve got a Jaguar\nCar.info(for: jaguar)    // You\'ve got a Car\n\nlet car = jaguar as Car\nJaguar.info(for: car)    // You\'ve got a Car\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,编译器info(for:)根据调用对象的静态类型和传递的参数来解析要调用的实现。如果它被调用 on Car,或者传递的参数被静态类型化为 a Car,则只有Car\ 的重载可能被静态分派到。

\n\n

静态分派的另一个示例是协议扩展,其中方法不是协议要求(因为使其成为要求,因此可以动态分派)。

\n\n
protocol Car {}\n\nextension Car {\n    func info() {\n        print("You\'ve got a Car")\n    }\n}\n\nclass Jaguar : Car {\n    func info() {\n        print("You\'ve got a Jaguar")\n    }\n}\n\nlet jaguar = Jaguar()\njaguar.info() // You\'ve got a Jaguar\n\nlet car = jaguar as Car\ncar.info()    // You\'ve got a Car\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,编译器info()仅根据所调用实例的静态类型来解析要调用的实现。

\n