swift 笔记 (十三) —— 继承

继承

一个类可以从其它类继承方法,属性以及一些特征。被继承的类叫父类,那另一种就是子类了。。这个我们都懂的。。

这是一个官方给的例子,它是一个基类(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 {     //注意override关键字

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 关键字,用来修饰我们需要防止子类的属性,方法,或者是下标,甚至是在类定义前面写上@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

swift 笔记 (十三) —— 继承,布布扣,bubuko.com

时间: 2024-10-23 05:12:20

swift 笔记 (十三) —— 继承的相关文章

Swift学习笔记十三:继承

一个类可以继承(inherit)另一个类的方法(methods),属性(property)和其它特性 一.基本语法 class Human{ var name :String init(){ name = "human" println(name) } func description(){ println("name:\(name)") } } class Student:Human{ var score = 0 init(){ super.init() name

swift 笔记 (十四) —— 构造过程

构造过程 为了生成类.结构体.枚举等的实例,而做的准备过程,叫做构造过程. 为了这个过程,我们通常会定义一个方法来完成,这个方法叫做构造器.当然它的逆过程,叫做析构器,用于在实例被释放前做一些清理工作以及一此自定义化的处理. 为存储型属性设置初始值 类和结构体在生成实例那一刻,必须为所有的属性赋以特定的初始值. 要么在定义存储型属性的时候直接给个初始值,否则就必须在构造器里面指定一个初始值. 上面说的这两种情况,都不会触发存储型属性的监听者行为(property observer). struc

swift 笔记 (十九) —— 协议

协议(Protocols) 协议仅是用定义某些任务或者是功能必须的方法和属性.类似于java里的interface的作用.但协议并不会实现具体的功能. 我猜这个名字源于OO中提到的"契约",但我并不觉得这名字很好,反而是interface这名字更容被接受,因为我觉得协议这个名字很容易和网络编程的时候的网络协议搞混,网络协议也通常简称为协议. 语法: protocol MyProtocol { //协议定义 } struct MyStruct: MyProtocol1, MyProtoc

从0开始学Swift笔记整理(三)

这是跟在上一篇博文后续内容: --Swift中相关的属性 存储属性 Swift中的属性分为存储属性和计算属性,存储属性就是Objective-C中的数据成员,计算属性不存储数据,但可以通过计算其他属性返回数据.存储属性可以存储数据,分为常量属性(用关键字let定义)和变量属性(用关键var定义). 存储属性概念: 我们在前面曾用到过属性,Employee类和Department结构体.它们的类图如下,Employee 的部门属性dept与Department之间进行了关联. 我们可以在定义存储属

laravel3学习笔记(十三)

原作者博客:ieqi.net ==================================================================================================== 类的自动载入 使用 PHP 自身的 include 或者 require 族的函数载入重用代码一般情况下很难帮助我们更好的组织工程代码,对于此,从便捷和性能的方面考虑, Laravel3 为我们提供了类的自动载入功能.自动载入可以让我们在需要的时候才载入所需要的类文件

C++学习笔记之继承

一.基类和派生类 很多时候,一个类的对象也“是”另一个类的对象,如矩形是四边形,在C++中,矩形类Rectangle可以由四边形类Quad继承而来,于是,四边形类Quad是基类,矩形类Rectangle是派生类.但是如果说四边形一定是矩形显然不对.几个简单的基类和派生类的例子: 基类                         派生类   食物 米饭.面条.水饺   交通工具 汽车.火车.飞机 国家 中国.美国.西班牙 可以看出,每个派生类的对象都是基类的一个对象,并且一个基类可以有很多派生

swift 笔记 (十六) —— 可选链

可选链(Optional Chaining) 我们都知道"可选型"是什么,那么可选链又是什么,举个例子解释一下: struct MyName{ var name } struct MyInfo { var myName:MyName? = MyName() } class MyClass { var structInstance: MyInfo? = MyInfo() } 这里有两个结构体和一个类,当,这个类实例化的时候: var myInstance = MyClass() 所有的可

swift笔记- 枚举

枚举是一系列相关值的通用类型,是类型安全的. Swift中的枚举不需要为每一个成员赋值,而成员的值可以是 字符串 字符 或者人意的整数或浮点值. 枚举成员可以指定任何存储成员值类型的关联值enumeration members can specify associated values of any type to be stored along with each different member value.枚举成员可以是相关的成员集合,而每个成员也可以是一个单独的小集合. 枚举跟传统的类结

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep