当前位置: 代码迷 >> 综合 >> Day:19:继承
  详细解决方案

Day:19:继承

热度:25   发布时间:2023-09-29 18:58:35.0
  • 定义基类
  1. 任何不从另一个类继承的类都是所谓的基类
  2. swift类不会从一个通用基类继承。你没有指定特定的类都会以基类的形式创建。
  • 子类
  1. 子类是基于现有类创建新类的行为。子类从现有的类继承了一些特征,你可以重新定义它们。你也可以为子类添加新的特征。
  2. 为了表明类有父类,要把子类写在父亲类的前面,用冒号分割。
  • 重写
  1. 子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。这就所谓的重写。
  2. 要重写而不是继承一个特征,你需要在你的重写定义前面加上override关键字。这样说明你打算提供一个重写而不是意外提供类一个相同定义。意外的重写可能导致意想不到的行为,并且任何没有使用override关键字的重写都会在编译时被诊断为错误。
  • 访问父类的方法、属性和下标脚本
  1. 你可以通过使用super前缀访问父类的方法、属性或脚本
  2. 一个命名为someMethod()的重写方法可以通过super.someMethod()在重写方法的实现中调用父类版本的someMethod()方法。
  3. 一个命名为someProperty的重写属性通过super.someProterty在重写的getter或setter实现中访问父类版本的someProperty
  4. 一个命名为someIndex的重写下标脚本可以使用super[someIndex]在重写的下标脚本实现中访问父类版本中相同的下标脚本。
  • 重写方法
  1. 可以在的子类中重写一个继承的实例或类型方法来提供定制的货替代的方法实现。
  • 重写属性的getter和setter
  1. 可以提供一个自定义的getter(和setter,如果合适的话)来重写任意继承的属性,无论在最开始继承的属性实现为存储属性还是计算属性。
  • 重写属性的观察器
  1. 可以使用属性重写来为继承的属性添加属性观察器。这就可以让在继承属性的值改变时得到通知,无论这个属性最初如何实现。
  2. 不给继承而来的常量存储属性或者只读属性添加属性观察器。这些属性的值不能被设置,所以提供willSet或didSet实现作为重写的一部分也是不合法的。
  3. 不能为同一个属性同时提供重写的setter和重写的属性观察器。如果你想要监听属性值的改变,并且你已经为那个属性提供了一个自定义的setter,那么你从自定义的setter里就可以监听任意值的改变。
  • 阻止重写
  1. 可以通过标记为final来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或下标脚本的关键字前面写final修饰符(比如 final var\final func\final class func\final subscript)
  • 【代码演示】
    class Vehicle {var currentSpeed:Int = 0var desc:String{return "run at speed \(currentSpeed)"}func makeNoise(){}
    }class Car:Vehicle{var gear:Int = 0override var desc: String{super.desc + "at gear \(gear)"}
    }var car = Car()
    car.gear = 3
    car.currentSpeed = 30print(car.desc) //结果:run at speed 30at gear 3class Animal {final var flySpeed:Int = 0var desc:String{return "Animal run at speed \(flySpeed)"}func run(){print("Animal run")}
    }class Cat:Animal{var eat:Int = 0override var desc: String{super.desc + "at eat \(eat)"}}
    

  相关解决方案