swift简单总结(二十三)—— 继承

版本记录

版本号 时间
V1.0 2017.07.29

前言

我是swift2.0的时候开始接触的,记得那时候还不是很稳定,公司的项目也都是用oc做的,并不对swift很重视,我自己学了一段时间,到现在swift3.0+已经出来了,自己平时也不写,忘记的也差不多了,正好项目这段时间已经上线了,不是很忙,我就可以每天总结一点了,希望对自己对大家有所帮助。在总结的时候我会对比oc进行说明,有代码的我会给出相关比对代码。
1. swift简单总结(一)—— 数据简单值和类型转换
2. swift简单总结(二)—— 简单值和控制流
3. swift简单总结(三)—— 循环控制和函数
4. swift简单总结(四)—— 函数和类
5. swift简单总结(五)—— 枚举和结构体
6. swift简单总结(六)—— 协议扩展与泛型
7. swift简单总结(七)—— 数据类型
8. swift简单总结(八)—— 别名、布尔值与元组
9. swift简单总结(九)—— 可选值和断言
10. swift简单总结(十)—— 运算符
11. swift简单总结(十一)—— 字符串和字符
12. swift简单总结(十二)—— 集合类型之数组
13. swift简单总结(十三)—— 集合类型之字典
14. swift简单总结(十四)—— 控制流
15. swift简单总结(十五)—— 控制转移语句
16. swift简单总结(十六)—— 函数
17. swift简单总结(十七)—— 闭包(Closures)
18. swift简单总结(十八)—— 枚举
19. swift简单总结(十九)—— 类和结构体
20. swift简单总结(二十)—— 属性
21. swift简单总结(二十一)—— 方法
22. swift简单总结(二十二)—— 下标脚本

继承

  继承是面向对象编程的特点,OC中也有继承,swift同样也有继承。类可以调用和访问超类的方法,属性和下标脚本,并可重写override这些方法。可以为类中继承来的属性添加属性观察器(property observer),这样一来,当属性值改变时,类就会被通知到,可以为任何属性添加属性观察器。

下面我们就从以下几个方面阐述继承。

  • 定义一个基类(Base class)
  • 子类生成(Subclassing)
  • 重写(Overriding)
  • 防止重写

定义一个基类

  不继承其他类的类,称为基类。在swift中的类并不是从一个通用的基类继承而来,如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。

看下面代码

class Vehicle{
    var currentSpeed = 0.0
    var description : String{

    }
    func makeNoise(){

    }
}

这里,Vehicle就成为了一个基类。


子类生成

  子类生成指的是在一个已有类的基础上创建一个新的类,子类继承超类的特性,并且可以优化或改变它,你还可以为子类添加新的特性。

在定义的时候,将超类名写在子类名的后面,用冒号分割。

class Bicycle : Vehicle{
    var hasBasket  = false
}

OC一样,子类还可以被其他类继承,并继承其属性、方法等其他方面。


重写

子类可以为继承来的实例方法、类方法、实力属性、或下标脚本提供自己定制的实现,我们把这个叫做重写。重写的时候就在前面加上override关键字。比较经典的就是swift实例化控制器以后,如下代码。

    override func viewDidLoad()
    {
        super.viewDidLoad()       
    }

这个是控制器实例的时候,就有重写override这个方法。

1. 访问超类的方法、属性和下标脚本

当你的子类中重写超类的方法、属性或者下标脚本时,有时你的重写版本中使用已经存在的超类实现会大有裨益。

在合适的地方,你可以通过使用super前缀来访问超类版本的方法、属性或下标版本。例如:

  • 在方法someMethod的重写实现中,可以通过super. someMethod ()来调用超类版本的someMethod方法。

2. 重写方法

在子类中,你可以重写继承来的实例方法或类方法,提供一个定制或替代的方法实现。

下面看一下代码。

class Vehicle{
    var currentSpeed = 0.0
    var description : String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    
    func makeNoise() {
        print("nothing to do")
    }
}

class Train: Vehicle {
    override func makeNoise() {
        print("train")
    }
}

class JJSwiftVC: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        let train = Train()
        train.makeNoise()
    }
}

下面看一下输出结果

train

3. 重写属性

你可以重写继承来的实例属性和类属性,提供自己定制的settergetter方法,或添加熟悉属性观察器使重写的属性观察值什么时候发生改变。

4. 重写属性的setter和getter方法

  你可以提供定制的gettersetter来重写任意继承来的属性,无论继承来的属性是存储型的还是计算型的属性,子类并不知道继承来的属性是存储型的还是计算型的,它只是知道继承来的属性会有一个名字和类型,你在重写一个属性时,必须将它的名字和类型都写出来,这样编译器去检查你重写的属性是与超类中同名同类的属性相匹配的。

  你可以将一个继承来的只读属性重写为一个读写属性,只需要你重写属性里的getter和setter方法,但是,你不可以将一个继承来的读写属性重写为一个只读属性。

注意:如果你在重写属性中提供了setter,那么你也一定要提供getter。如果你不想在重写版本中的getter里修改继承来的属性值,你可以直接通过super.someProperty来返回继承来的值,其中someProperty是你要重写的属性的名字。

class Vehicle{
    var currentSpeed = 0.0
    var description : String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    
    func makeNoise() {
        print("nothing to do")
    }
}

class Car : Vehicle{
    var gear = 1
    override var description: String{
        return super.description + "in gear \(gear)"
    }
}

class JJSwiftVC: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.green
        
        let car = Car()
        car.currentSpeed = 25.0
        car.gear = 3
        print("Car : \(car.description)")
    }
}

下面看一下输出结果

Car : traveling at 25.0 miles per hourin gear 3

5. 重写属性观察器

你可以在属性重写中为一个继承来的属性添加属性观察器,这样一来,当继承类的属性值发生改变时,你就会被通知到。

注意:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器,这些属性是不可以设置的。还要注意不要同时提供重写的setter和重写属性观察器,如果你想要观察属性值的变化,并且你已经为那个属性提供了定制的setter,那么你在setter中就可以观察到任何值变化了。

class AutomaticCar : Car{
    override var currentSpeed: Double{
        didSet{
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

class JJSwiftVC: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.green
        
        let automaticCar = AutomaticCar()
        automaticCar.currentSpeed = 35.0
        print("automaticCar : \(automaticCar.description)")
    }
}

下面看结果输出

automaticCar : traveling at 35.0 miles per hourin gear 4

防止重写

有的时候你不希望被重写,那么你可以通过把方法、属性或下标脚本标记为final来防止它们被重写,只需要在声明关键字前加上@final特性即可。
-final var
-final func
-final class func
-final subscript

同时你也可以在关键字class前添加final特性(final class)来将整个类标记为final的,这样的类是不可以继承的。

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容