美文网首页
09-方法、下标、继承

09-方法、下标、继承

作者: SwordDevil | 来源:发表于2021-08-04 09:04 被阅读0次

    一、方法(Method)

    mutating

    @discardableResult

    二、下标(subscript)

    sub  script
    <sup> : 上标 -> 在左上角显示的数字
    <sub> : 下标 -> 在右下角显示的数字
    

    下标的细节

    结构体、类作为返回值对比

    接收多个参数的下标

    三、继承(Inheritance)

    内存结构

    Animal是堆空间的对象 需要占用16个字节,最前面的8个字节用来放类型信息,再往后的8个字节放引用计数相关的东西,在往后才是放age的,而且还有个内存对齐,所以class Animal占32个字节
    Dog继承子Animal,相当于把age直接拿到Dog内部,所以还是32个字节
    同理,ErHa是把上面的拿到内部,所以是48个字节

    重写实例方法、下标

    重写类型方法、下标

    但是子类的class可以替换成static

    重写属性

    • 子类可以将父类的属性(存储、计算)重写为计算属性

    • 子类不可以将父类属性重写为存储属性

    • 只能重写var属性,不能重写let属性

    • 重写时,属性名、类型要一致

    • 子类重写后的属性权限不能小于父类属性的权限
      ->如果父类属性是只读的,那么子类重写后的属性可以是只读的、也可以是可读写的
      ->如果父类属性是可读写的,那么子类重写后的属性也必须是可读写的

    重写实例属性

    重写类型属性

    属性观察器

    final

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

    多态

    /*
     多态的实现原理:
     1.OC:Runtime
     2.C++:虚表(虚函数表)
     
     Swift中多态的实现原理(比较偏向于C++)
     */
    
    class Animal {
        func speak() {
            print("Animal speak")
        }
        func eat() {
            print("Animal eat")
        }
        func sleep() {
            print("Animal sleep")
        }
    }
    
    class Dog: Animal {
        override func speak() {
            print("Dog speak")
        }
        override func eat() {
            print("Dog eat")
        }
        func run() {
            print("Dog run")
        }
    }
    
    // 父类指针指向子类对象,多态
    var anim: Animal
    anim = Animal()
    anim.speak()
    anim.eat()
    anim.sleep()
    
    anim = Dog()
    anim.speak()
    anim.eat()
    anim.sleep()
    //anim.run()
    
    

    相关文章

      网友评论

          本文标题:09-方法、下标、继承

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