类的定义

优质
小牛编辑
126浏览
2023-12-01

类的定义

1.定义基类

  • 任何不从另一个类继承的类都是所谓的基类
  • Swift类不会从一个通用基类继承. 你没有指定特定父类的类都会以基类的形式创建.
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() -> Void {

    }
}

2.定义子类

  • 子类是基于现有类创建新类的行为.子类从现有的类继承了一些特征, 你可以重新定义它们. 你也可以为子类添加新的特征.
  • 为了表明子类有父类, 要把子类写在父类的签名, 用冒号(:)分隔.
class Bicycle: Vehicle {
    var hasBasket = false
}

3. 重写

  • 子类可以提供它自己的实例方法、类型方法、实例属性, 类型属性或下标脚本的自定义实现, 否则它将会从父类继承. 这就是所谓的重写.
  • 要重写而不是继承一个特征, 你需要在你的重写定义前面加上override关键字. 这样做说明你打算提供一个重写而不是意外提供了一个相同定义. 意外的重写可能导致意想不到的行为, 并且任何没有使用override关键字的重写都会在编译时被诊断错误.
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        "traveling at \(currentSpeed) miles per hour"
    }

    func makeNoise() -> Void {

    }
}

class Bicycle: Vehicle {
    var hasBasket = false
    override func makeNoise() {

    }
}

4. 访问父类的方法、属性和下标脚本

  • 你可以通过使用super前缀访问父类的方法、属性或下标脚本
  • 一个命名为someMethod()的重写方法可以通过super.someMethod() 在重写方法的实现中调用父类版本的someMethod()方法
  • 一个命名为someProperty的重写属性可以通过super.someProperty在重写的gettersetter实现中访问父类版本的someProperty属性
  • 一个命名为someIndex的重写下标脚本开使用super[someIndex]在重写的下标脚本实现中访问父类版本中相同的下标脚本
class Car: Vehicle {
    var gear = 1
    override var description: String {
        super.description + " in gear \(gear)"
    }
}

5. 重写属性的观察器

  • 可以使用属性重写来为继承的属性添加属性观察器. 这就可以让你在继承属性的值改变时得到通知, 无论这个属性最初如何实现.
  • 不能给继承而来的常量存储属性或者只读的计算属性添加属性观察器.这些属性的值不能被设置, 所以提供willSetdidSet实现作为重写的一部分也是不合适的.
  • 不能为同一个属性同时提供重写的setter和重写的属性观察器 如果你想要监听属性值的改变, 并且你已经为那个属性提供了一个自定义的setter, 那么你从自定义的setter里就可以监听任意值的改变.
class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AaautomaticCar: \(automatic.description)")
  1. 定义的存储属性
  2. 继承的存储属性
  3. 继承的计算属性

下一篇 - 类的继承和初始化