swift 笔记 (十三) —— 继承
继承 一个类能够从其他类继承方法。属性以及一些特征。
这是一个官方给的样例。它是一个 基类(Base Class),由于它没有继承不论什么一个类。这个类里面有一个init方法,我们临时忽略,仅仅要知道这是个初始化方法。在我们创建一个类的实例的时候,这种方法会被运行,下一篇笔记会具体分析。
class MyCar : Vehicle { //继承的语法 init () { //MyCar 类的初始化方法 super.init() //MyCar的父类 Vehicle的初始化方法 numberOfWheels = 4 //从Vehicle继承过来的属性 } }
这样。我的小车车就拥有了4个轮子。以及1位乘客(继承自父类)........但。这怎么都不像汽车。。。貌似在我上初中的时候,奔驰出过一款三轮流线型仅仅有1位乘客的汽车。但后来为啥没有生产就不知道了。。
C++会自己主动继承初始化方法,C++也会自己主动运行默认的初始化方法,而swift既不会继承父类的初始化,也不会自己主动运行父类的初始化方法, 囧。
(马赛洛进球了。
我的小车车仅仅有一个乘客。。
class MyCar : Vehicle { init () { super.init() numberOfWheels = 4 maxPassengers = 5 //唔,我的小车车最终能够坐5个人了(包含我自己) } }
let car = MyCar() //这句会自己主动运行 MyCar类的 init方法 println(“car : \(car .description())”) //description方法是从父类继承来的。在MyCar类里并未定义
方法重写(Overriding Methods) 看到这个样例的时候笑尿了,官方居然也用了Car。。。。你的Bicycle呢?(上一个样例中,官方用的是Bicycle类)无论官方用啥吧,我还是继续为我的MyCar做下美容:
class MyCar: Vehicle { var speed: Int = 0 //为小车加上速度属性
init() { super.init() numberOfWheels = 4 maxPassengers = 5 }
override func description() -> String { // 注意 overridekeyword return super.description() + “ now speed is \(speed) mph” //仅仅是在父类的description输出内容后面加字 } }
这样。我们就重写了从父类继承过来的 description方法的行为 let car = MyCar() println(“car : \(car.description())")
(内马尔~帅~ 进了!。。) (讲解员:“上半场打到30分钟,已经有两个进球了,这场比赛非常精彩” 哈哈哈 笑尿了)
我们也能够对父类属性的set和get 方法进行重写,但是必须写清属性名和属性类型。 这样的重写,是全然忽略这个属性在父类中定义成用于计算的或者是用于存储的。甚至,在子类中提供set和get方法,就能够把父类的“仅仅读”型属性重写成“读写”型属性。 当然,假设我们在重写属性的时候。提供了一个set 方法。那么必须还要再提供一个get方法才行。
上海的高架限速是100mph, 所以。我还得为我的车车加个限速:
class MySpeedLimitedCar: MyCar { override var speed: Int { //override 指出这是一个重写的属性 get { return super.speed } set { println(“car must seed limited lower than 100 mph.") super.speed = min( newValue, 100) //newValue是 set默认提供的,前面的笔记有说过 } } }
let car = MySpeedLimitedCar() car.speed = 101 //这里会输出一行提示,然后speed的值会被设置为100
重写属性的监听者 (Overriding Property Observers) 我们不能为一个不能改变值的属性重写属性的监听者,比方继承来的常量,继承来的”仅仅读“型用于计算的属性。 为一个属性同一时候增加set方法和监听者。也是不能够的。
如今,我须要给我的小车车升级为自己主动档。手动档太累了。
class AutomaticCar: Car { var gear = 1 //档位 override var speed: Int { didSet { //为speed属性增加监听者 gear = speed / 10 + 1 //依据speed值设置 档位 属性 } }
overrid func description() -> String { return super.description() + “ in great \(gear)" } }
let car = AutomaticCar() automatic.speed = 60 println(“my car: \(car.description())")
防止重写 在非常多时候。我们须要防止子类重写我们的类。 swift 提供了 @final keyword,用来修饰我们须要防止子类的属性,方法。或者是下标 。甚至是在类定义前面写上@final。
比方,我们在本期开头帖图的那个Vehicle类中的 func description()-> String的最前面加上@final, 让它变成:
@final func description() -> String { //这里仅仅在最前面加了个 @final return “\(numberOfWheels) wheels; up to \(maxPassenger) passengers" }
那么,我们能够在子类 MyCar中,overrid func description() -> String的地方,发现一条编译错误: Instance method overrides a ‘final’ instance method
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄
被继承的类叫父类,那还有一种就是子类了。。这个我们都懂的。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。。

这是一个官方给的样例。它是一个 基类(Base Class),由于它没有继承不论什么一个类。这个类里面有一个init方法,我们临时忽略,仅仅要知道这是个初始化方法。在我们创建一个类的实例的时候,这种方法会被运行,下一篇笔记会具体分析。
class MyCar : Vehicle { //继承的语法 init () { //MyCar 类的初始化方法 super.init() //MyCar的父类 Vehicle的初始化方法 numberOfWheels = 4 //从Vehicle继承过来的属性 } }
这样。我的小车车就拥有了4个轮子。以及1位乘客(继承自父类)........但。这怎么都不像汽车。。。貌似在我上初中的时候,奔驰出过一款三轮流线型仅仅有1位乘客的汽车。但后来为啥没有生产就不知道了。。
。。
C++会自己主动继承初始化方法,C++也会自己主动运行默认的初始化方法,而swift既不会继承父类的初始化,也不会自己主动运行父类的初始化方法, 囧。
。。。
(马赛洛进球了。
。
。
本届世界标的第一枚。。。笑尿了)
我的小车车仅仅有一个乘客。。
。。不够啊。。。让我们多加几个乘客吧!
但是。在swift中。仅仅同意在初始化阶段改变父类的属性变量。
。。
于是,我们仅仅好又一次写这个MyCar类了:
class MyCar : Vehicle { init () { super.init() numberOfWheels = 4 maxPassengers = 5 //唔,我的小车车最终能够坐5个人了(包含我自己) } }
let car = MyCar() //这句会自己主动运行 MyCar类的 init方法 println(“car : \(car .description())”) //description方法是从父类继承来的。在MyCar类里并未定义
方法重写(Overriding Methods) 看到这个样例的时候笑尿了,官方居然也用了Car。。。。你的Bicycle呢?(上一个样例中,官方用的是Bicycle类)无论官方用啥吧,我还是继续为我的MyCar做下美容:
class MyCar: Vehicle { var speed: Int = 0 //为小车加上速度属性
init() { super.init() numberOfWheels = 4 maxPassengers = 5 }
override func description() -> String { // 注意 overridekeyword return super.description() + “ now speed is \(speed) mph” //仅仅是在父类的description输出内容后面加字 } }
这样。我们就重写了从父类继承过来的 description方法的行为 let car = MyCar() println(“car : \(car.description())")
(内马尔~帅~ 进了!。。) (讲解员:“上半场打到30分钟,已经有两个进球了,这场比赛非常精彩” 哈哈哈 笑尿了)
我们也能够对父类属性的set和get 方法进行重写,但是必须写清属性名和属性类型。 这样的重写,是全然忽略这个属性在父类中定义成用于计算的或者是用于存储的。甚至,在子类中提供set和get方法,就能够把父类的“仅仅读”型属性重写成“读写”型属性。 当然,假设我们在重写属性的时候。提供了一个set 方法。那么必须还要再提供一个get方法才行。
上海的高架限速是100mph, 所以。我还得为我的车车加个限速:
class MySpeedLimitedCar: MyCar { override var speed: Int { //override 指出这是一个重写的属性 get { return super.speed } set { println(“car must seed limited lower than 100 mph.") super.speed = min( newValue, 100) //newValue是 set默认提供的,前面的笔记有说过 } } }
let car = MySpeedLimitedCar() car.speed = 101 //这里会输出一行提示,然后speed的值会被设置为100
重写属性的监听者 (Overriding Property Observers) 我们不能为一个不能改变值的属性重写属性的监听者,比方继承来的常量,继承来的”仅仅读“型用于计算的属性。 为一个属性同一时候增加set方法和监听者。也是不能够的。
如今,我须要给我的小车车升级为自己主动档。手动档太累了。
class AutomaticCar: Car { var gear = 1 //档位 override var speed: Int { didSet { //为speed属性增加监听者 gear = speed / 10 + 1 //依据speed值设置 档位 属性 } }
overrid func description() -> String { return super.description() + “ in great \(gear)" } }
let car = AutomaticCar() automatic.speed = 60 println(“my car: \(car.description())")
防止重写 在非常多时候。我们须要防止子类重写我们的类。 swift 提供了 @final keyword,用来修饰我们须要防止子类的属性,方法。或者是下标 。甚至是在类定义前面写上@final。
比方,我们在本期开头帖图的那个Vehicle类中的 func description()-> String的最前面加上@final, 让它变成:
@final func description() -> String { //这里仅仅在最前面加了个 @final return “\(numberOfWheels) wheels; up to \(maxPassenger) passengers" }
那么,我们能够在子类 MyCar中,overrid func description() -> String的地方,发现一条编译错误: Instance method overrides a ‘final’ instance method

更多精彩