13、【Swift】继承 - Inheritance

  • 区分【类】和其他类型的一个特征:继承
  • 子类 继承 超类(父类)的属性、方法和下标。
    • 可调用、重写父类的方法、属性和下标
    • 为父类添加属性观察器(存储属性和计算属性都可以)

定义一个基类

  • 基类:不继承其他类

与 OC 相比,Swift 类不默认继承基类

没有指定父类,都是基类

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // 什么也不做——因为车辆不一定会有噪音
    }
}
let someVehicle = Vehicle()
  • 访问它的 description 属性来打印车辆的当前速度:
print("Vehicle: \(someVehicle.description)")
// 打印“Vehicle: traveling at 0.0 miles per hour”

子类生成

  • 指明某个类的超类,将超类名写在子类名的后面,用冒号分隔:
class SomeClass: SomeSuperclass {
    // 这里是子类的定义
}
class Bicycle: Vehicle {
    var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
  • 修改继承的 currentSpeed 属性
bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// 打印“Bicycle: traveling at 15.0 miles per hour”
  • 创建了一个名为 Tandem(双人自行车)的子类
class Tandem: Bicycle {
    var currentNumberOfPassengers = 0
}
let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers = 2
tandem.currentSpeed = 22.0
print("Tandem: \(tandem.description)")
// 打印:“Tandem: traveling at 22.0 miles per hour”

重写

  • 重写:子类可以为继承来的实例方法,类方法,实例属性,类属性,或下标提供自己定制的实现

  • 重写(非继承)定义前面加上 override 关键字(不写关键字会报错)

  • override 会查找父类是否有重写的属性、方法等

访问超类的方法,属性及下标

  • 重写时,可多调用父类方法实现
  • 使用 super 前缀来访问超类版本的方法,属性或下标:
    • 方法重写:通过 super.someMethod() 来调用超类版本的 someMethod() 方法
    • 属性的 getter 、setter 的重写: super.someProperty 来访问超类 someProperty 属性
    • 下标重写:通过 super[someIndex] 来访问超类版本中的相同下标

重写方法

  • 可重写方法类型:实例方法、类型方法
class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}
let train = Train()
train.makeNoise()
// 打印“Choo Choo”

重写属性

  • 可重写的属性类型:存储属性、计算属性
  • 重写属性-应用场景:
    • 自定义 getter + setter 方法实现
    • 添加属性观察器

重写属性的 Getters 和 Setters

  • 重写声明:属性名 + 类型
  • 只读属性 重写为 读写属性(同时提供 getter + setter 即可)
  • 读写属性 不可重写为 只读属性

重写属性的增加 setter,也必须 提供 getter方法

不想改变父类getter,可通过 super.someProperty 来返回继承来的值

class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// 打印“Car: traveling at 25.0 miles per hour in gear 3”

重写属性观察器

  • 无法添加属性观察器:
    • 常量 的存储属性(常量无法修改)
    • 只读计算属性 (只读不能写入)
  • 不可同时提供 setter + 属性观察器 (只需在 setter 内部监听即可)
class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}
  • 属性观察器将新的速度值除以 10,然后向下取得最接近的整数值,最后加 1 来得到档位 gear 的值。例如,速度为 35.0 时,档位为 4
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// 打印“AutomaticCar: traveling at 35.0 miles per hour in gear 4”

防止重写

  • 防重写,但可继承
    • 在声明关键字前加上 final 修饰符
    • 例如:final varfinal funcfinal class func 以及 final subscript
  • 类拓展也可使用 final 标记
  • 防止继承
    • 在关键字 class 前添加 final 修饰符(final class)来将整个类标记为 final ·

你可能感兴趣的:(13、【Swift】继承 - Inheritance)