swift 9: 面向对象 继承

所有面向对象语言都具有三大特征:封装、继承、多态

1:简介:

当有多个类具有相同的属性和行为时,将共同的部分提取出来封装成新的类,然后让多个类继承这个新类。(使代码维护起来更加简单)

(1)继承:与现实生活中的继承原理相同 。 例如:财产继承、基因继承等

(2)继承讲的是父与子的关系,子继承于父。 
编程语言中继承指的是类与类之间的继承

(3)关系:父类(parentClass) 、超类(superClass) 、基类 
子类(childClass) 、子类(subClass)、 派生类

(4)重写:子类继承父类的方法,属性,下标. 如果子类继承父类的方法,属性,下标,并不满足子类的需求,子类可以将继承过来的内容进行重写。
重写就是方法名相同,内容不同

(5)派生:子类也有自己的属性、方法、下标,子类较父类多出的部分,称为派生

2继承的格式

class name: super class {
    code
}

3单继承

(1)swift语言中没有统一的父类,如果定义类时没有指定该类的父类,那么这个类就可以充当父类

(2)swift语言中的继承指的是单继承,一个子类只有一个直接父类。可以借助协议实现多继承(和OC一样),在后续的文章协议中会具体介绍

(3)一个类的属性和方法在内存中分为两部分: 一部分是自身的属性和方法,一部分是从父类继承过来的属性和方法。

(4)self关键字在实例方法中相当于对象,在类方法中相当于类名

程序实例如下:

class Person {
    var name: String = ""
    static var age : Int = 0 // static也可以修饰属性
    
    func eat() -> Void {
        print("\(name)正在吃东西")
    }
    func sleep() -> Void {
        print("\(Person.age)正在睡觉")
        // static修饰的属性为类型属性, 必须通过类名调用.非static修饰的属性为存储属性 , 通过对象调用
    }
    static func hitDouDou () -> Void {
        print("\(age)正的在打豆豆")
        // <结论>self关键字在实例方法中相当于对象,在类方法中相当于类名
    }
}

class Man: Person {
    var height : Double = 0.0
    
    func writeCoder() -> Void {
        name = "ZZ"
        Man.age = 11
        print("\(name)今年:\(Man.age)岁了,身高:\(height),")
    }
}
var man = Man.init()
man.height = 1.90
man.writeCoder()
man.eat()
man.sleep()
Man.hitDouDou()

4:重写父类的方法

(1)子类重写父类的方法,子类重写的方法就会将父类的同名方法进行覆盖,所以子类对象调用的同名方法是子类重写的方法

(2)子类的方法名、参数列表,如果和父类中的方法完全相同,编译器默认就是重写方法,需要在方法名前加关键字override。

程序实例如下:

class Car {
    var speed : Double = 90.0
    var wheel : Int = 4
    
    func run() -> Void {
        print("速度为\(speed)的大众速腾后悬挂断了")
    }
    class func stop () {
        print("因为断轴不会跑了")
    }
}

var car = Car.init()
car.run()
Car.stop()

class Bike: Car {
    override func run() {
         super.run() // super关键字!只是!用来调用父类的方法或者属性,只是个关键字,没有其它意义
        print("跑丢了\(wheel)轮子")
    }
    // 父类中使用static修饰的方法/属性 子类只能继承 不能重写
    // 父类中使用class修饰的方法/属性 子类可以重写 但是很少使用class关键字定义方法
    override class func stop () {
        super.stop()
    }
}
var bike = Bike.init()
bike.speed = 20.0
bike.wheel = 2
bike.run()
Bike.stop()

5重写父类的属性

(1)swift语言中是允许子类重写父类的属性的,可以为重写的属性指定get和set方法,实现对重写属性进行读写操作,也可以添加属性观察者willSet didSet

(2)子类重写父类的属性 ,如果父类的属性是只读属性(get), 子类重写的时候可以添加set方法 , 但是 如果父类的属性是读写属性(get,set) 子类重写的时候如果只有只读或者只写部分,是会崩溃的。

程序示例如下:

class Cat {
    var color : String = ""
    var description: String {
//        get {
            return "🐱"
//        }
    }
}
class Panda: Cat {
    override var color: String {
        get{
            return super.color
        }
        set{
            super.color = newValue
        }
    }
    override var description: String {
        get {
            return "国宝"
        }
        set {
            print("重写父类的计算属性的set方法")
        }
    }
}
var panda = Panda.init()
panda.color = "黑白色"

print(panda.description)

6重写父类下标

和父类的下标写法几乎一样,见代码如下

class Fruit {
    var color : String = ""
    
    subscript (index: Int) -> String {
        set {
            color = newValue
        }
        get {
            return color
        }
    }
}
var f = Fruit.init()
f[0] = "Green"
print(f[0])

class Apple: Fruit {
    override subscript (index: Int) -> String {
        get {
            return color + "苹果"
        }
        set {
            color = newValue
        }
    }
}
var apple = Apple.init()
apple[0] = "Rad"
print(apple[0])

7父类禁止子类重写的方法

(1)关键字 final 可以修饰 类, 方法, 属性, 下标

(2) final 修饰的 【类】是不能被继承的 , final 修饰的方法、属性、下标是不能被重写的

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

推荐阅读更多精彩内容