美文网首页iOS 开发 iOS Developer
swift 9: 面向对象 继承

swift 9: 面向对象 继承

作者: 前进的苏辰 | 来源:发表于2016-08-12 13:28 被阅读0次

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

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 修饰的方法、属性、下标是不能被重写的

相关文章

  • swift 9: 面向对象 继承

    所有面向对象语言都具有三大特征:封装、继承、多态 1:简介: 当有多个类具有相同的属性和行为时,将共同的部分提取出...

  • Swift 是一门什么样的语言

    Swift 既是面向对象的,又是函数式的编程语言。 Swift是面向对象的语言。 Swift支持类的封装、继承和多...

  • 7.面向对象编程

    Swift 面向对象编程 面向对象的三大特性 继承封装多态 基本单元 枚举结构体类协议扩展 面向对象概述 从整体的...

  • 类继承

    继承是面向对象的重要特征之一。swift中的继承只能发生在类上,结构体和枚举不能继承。在swift中,一个类继承另...

  • swift面相对象的基础<一>

    面向对象的核心是类和对象,面向对象的三大特征:封装,继承和多肽。swift可以定义枚举,结构体和类三种面向对象的实...

  • 08 Swift 继承与几大关键字\构造方法\继承与构造方法

    1. Swift继承\super关键字\override关键字\final关键字 继承语法 继承是面向对象最显著的...

  • JavaScript之面向对象编程

    五、面向对象编程 目录:面向对象原型继承、面向对象class继承(ES6引入的) 1.面向对象原型继承 类:模板 ...

  • iOS复习之重写与重载

    iOS面向对象的三大特征 封装、继承、多态 Swift-重写与重载的使用和比较

  • swift问题小结

    1.swift是面向对象还是函数式编程语言 swift是函数式也是面向对象的语言。swift是面向对象语言,因为他...

  • Swift特性

    Swift是面向对象还是函数式的编程语言 Swift 既是面向对象的,又是函数式的编程语言。说 Swift 是面向...

网友评论

    本文标题: swift 9: 面向对象 继承

    本文链接:https://www.haomeiwen.com/subject/ittesttx.html