继承(学习笔记)
环境Xcode 11.0 beta4 swift 5.1
-
继承
- 一个类可以从另一个类继承方法、属性及其它的特征
- 子类可以调用和访问属于其父类的方法、属性和下标,并可以提供这些方法、属性和下标的重写版本,以改进或修改它们的行为
- 子类还可以为继承的属性添加属性(存储属性和计算属性)观察者
-
定义一个基类
-
Swift
不像OC
有一个基类NSObject
, 任何一个不继承其它类的类都是基类class Vehicle { var currentSpeed = 0.0 var description: String { return "traveling at \(currentSpeed) miles per hour" } func makeNoise() { // do nothing - an arbitrary vehicle doesn't necessarily make a noise } } let someVehicle = Vehicle() print("Vehicle: \(someVehicle.description)") // Vehicle: traveling at 0.0 miles per hour
-
-
子类wx
-
定义一个子类
class Bicycle: Vehicle { var hasBasket = false } let bicycle = Bicycle() bicycle.hasBasket = true bicycle.currentSpeed = 15.0 print("Bicycle: \(bicycle.description)") // Bicycle: traveling at 15.0 miles per hour
-
-
重写
- 子类重写父类的方法、属性、下标要用关键字
override
, 编译器会根据此关键字进行检查父类是不有提供相应的声明 - 重写的方法、属性、下标想要访问父类可以用
super
关键字,如super.someMethod
、super.someProperty
、super[someIndex]
-
方法重写
class Train: Vehicle { override func makeNoise() { print("Choo Choo") } } let train = Train() train.makeNoise() // Prints "Choo Choo"
-
属性重写,可以为实例和类型属性添加自己的
getter
、setter
(可选的)以及 属性观察器,如果父类属性是read-only
继承后可以read-write
,反之不行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 } } } let automatic = AutomaticCar() automatic.currentSpeed = 35.0 print("AutomaticCar: \(automatic.description)") // AutomaticCar: traveling at 35.0 miles per hour in gear 4
- 子类重写父类的方法、属性、下标要用关键字
-
禁止重写
- 可以用
final
标识符禁止被继承(如: final var, final func, final class func, final subscript, final class),如果被final
修饰仍尝试继承,将会在编译期报错
- 可以用
请发表评论