美文网首页swift学习
Swift5.1 - 继承(9)

Swift5.1 - 继承(9)

作者: HChase | 来源:发表于2019-07-29 20:18 被阅读38次

继承

  • 值类型(枚举、结构体)不支持继承,只有(class)才能被继承;
  • 没有父类的类,为基类
  • swift 中没有像oc一样,任何类最终必须继承某个基类(如NSObject);
  • 子类继承父类的方法下标属性,如果重写父类的方法下标属性必须加上override关键字;

内存结构

图一
图二
  • 可以看出实例对象在堆中存储结构为,前面16个字节保留(前8位是指向类型信息,后8位是引用计算);之后存储的是属性值,父类的属性值在,子类的属性值在
  • 由于类的内存存储大小为16个字节的倍数;所以图一的占用堆空间大小为32个字节,图二占用堆空间为48个字节;

重写实例方法、下标

class Animal {
    func run() {
        print("Animal run")
    }
    
    subscript(index: Int) -> Int {
        return index
    }
}

class Person: Animal {
    override func run() {
        super.run()
        print("Person run")
    }
    
    override subscript(index: Int) -> Int {
        return super[index] + 1
    }
}

var p = Person()
/*
 Animal run
 Person run
 */
p.run()

// 11
print(p[10])
  • 重写父类的方法下标,需要加上 override 关键字;
  • 使用 super 可以调用父类的方法下标

重写类型方法、下标

  • class修饰的类型方法、下标,允许被子类重写;
  • static修饰的类型方法、下标,不允许被子类重写;
class Animal {
    class func run() {
        print("Animal run")
    }
}

class Person: Animal {
    override class func run() {
        super.run()
        print("Person run")
    }
}

重写属性

  • 子类可以将父类的属性(存储、计算)重写为计算属性
  • 子类不可以将父类属性重写为存储属性
  • 只能重写 var 属性,不能重写 let 属性;
  • 重写时,属性名属性类型 要一致;
  • 子类重写后的属性权限 不能小于 父类属性的权限;
  • class 修饰的 计算类型属性可以被子类重写;
  • static 修饰的 类型属性(计算、存储)不可以被子类重写;

属性观察器

  • 可以在子类中,为父类属性(除了只读计算属性let属性)增加属性观察器;
  • 可以在子类中,给父类的 计算属性 增加属性观察器;
class Animal {
    class var age: Int {
        set {
            print("Animal set ",newValue)
        }
        get {
            print("Animal get ")
            return 10
        }
    }
}

class Person: Animal {
    override class var age: Int {
        willSet {
            print("Person willSet ", newValue)
        }
        didSet {
            print("Person didSet ", oldValue, age)
        }
    }
}

Person.age = 20
/*
 Animal get
 Person willSet  20
 Animal set  20
 Animal get
 Person didSet  10 10
 */

final

  • final 修饰的方法、下标、属性,禁止重写
  • final 修饰的禁止继承

相关文章

  • Swift5.1 - 继承(9)

    继承 值类型(枚举、结构体)不支持继承,只有类(class)才能被继承; 没有父类的类,为基类; swift 中没...

  • Swift5.1继承

    13.继承 重写1.重写:⼦类可以为继承来的实例方法,类方法,实例属性,类属性,或下标提供⾃己定制的实现。我们把这...

  • Swift5.1读书笔记

    Swift5.1(参考Swift 编程网站5.1教程) [#%E5%9F%BA%E7%A1%80%E9%83%A8...

  • [Swift5.1] 11-继承

    继承(Inheritance) 值类型(枚举、结构体)不支持继承,只有类支持继承 没有父类的类,称为:基类Swif...

  • 关于SwiftUI,Swift5.1之后的小感

    Swift5.1之前是一门语言,Swift5.1之后是另外一门语言,作为一个从Swift2.0开始就在持续学习这么...

  • Swift与OC混编

    为什么要选择Swift 从2014年苹果推出Swift1.0到今年9月份的Swift5.1已经过去了5年,平均每年...

  • Swift5.1基础

    github:https://github.com/w0shiliyang/Swift5.1

  • UINavigationController中UIViewCon

    运行环境:xcode11,swift5.1 在UINavigationController 重写pushViewC...

  • [Swift5.1] 9-方法

    方法(Method) 枚举、结构体、类都可以定义实例方法、类型方法 实例方法(Instance Method):通...

  • Swift系统视频学习

    1、swift5.1基础语法:https://docs.swift.org/swift-book/Language...

网友评论

    本文标题:Swift5.1 - 继承(9)

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