美文网首页
Swift - 继承(Inheritance)

Swift - 继承(Inheritance)

作者: iVikings | 来源:发表于2020-06-23 15:32 被阅读0次

    继承(Inheritance)

    • 值类型(枚举、结构体)不支持继承,只有 支持继承

    • 基类:没有父类的类

      Swift 并 没有 像 OC、Java 那样的规定:任何类最终都要继承自某个基类

      NOTE
      Swift classes do not inherit from a universal base class. Classes you define without specifying a superclass automatically become base classes for you to build upon.

    • 子类可以重写父类的 下标、方法、属性,重写必须加上 override 关键字

    重写实例方法、下标

    class Animal {
        func speak() {
            print("Animal speak")
        }
        subscript(index: Int) -> Int {
            return index
        }
    }
    
    var animal: Animal = Animal()
    animal.speak() 
    print(animal[6])
    
    //Animal speak
    //6 
    
    class Cat: Animal {
        override func speak() {
            super.speak()
            print("Cat speak")
        }
        override subscript(index: Int) -> Int {
            return super[index] + 2
        }
    }
    
    var cat: Animal = Cat()
    cat.speak()
    print(cat[6])
    
    //Animal speak
    //Cat speak
    //8
    

    重写类型方法、下标

    • class 修饰的类型方法、下标,允许 被子类重写
    • static 修饰的类型方法、下标,不允许 被子类重写
    class Animal {
        class func speak() {
            print("Animal speak")
        }
        class subscript(index: Int) -> Int {
            return index
        }
    }
    
    Animal.speak()
    print(Animal[6])
    
    //Animal speak
    //6
    
    class Cat: Animal {
        override class func speak() {
            super.speak()
            print("Cat speak")
        }
        override class subscript(index: Int) -> Int {
            return super[index] + 2
        }
    }
    
    Cat.speak()
    print(Cat[6])
    
    //Animal speak
    //Cat speak
    //8
    

    重写属性

    • 子类可以将父类的属性(存储、计算)重写为 计算属性
    • 子类 不可以 将父类属性重写为 存储属性
    • 只能重写 var 属性,不能 重写 let 属性
    • 重写时,属性名、类型一致
    • 子类重写后的属性权限 不能小于 父类属性的权限
      • 如果父类属性是 只读,那么子类重写后的属性可以是 只读,也可以是 可读写
      • 如果父类属性时 可读写,那么子类重写后的属性也必须是 可读写

    重写实例属性

    class Circle {
        var radius: Int = 0
        var diameter: Int {
            set {
                print("Circle setDiameter")
                radius = newValue / 2
            }
            get {
                print("Circle getDiameter")
                return radius * 2
            }
        }
    }
    
    var circle: Circle = Circle()
    circle.radius = 6
    print(circle.diameter)
    circle.diameter = 20
    print(circle.radius)
    
    //Circle getDiameter
    //12
    //Circle setDiameter
    //10
    
    class SubCircle: Circle {
        override var radius: Int {
            set {
                print("SubCircle setRadius")
                super.radius = newValue > 0 ? newValue : 0
            }
            get {
                print("SubCircle getRadius")
                return super.radius
            }
        }
        
        override var diameter: Int {
            set {
                print("SubCircle setDiameter")
                super.diameter = newValue > 0 ? newValue : 0
            }
            get {
                print("SubCircle getDiameter")
                return super.diameter
            }
        }
    }
    
    var subCircle: Circle = SubCircle()
    subCircle.radius = 6
    print(subCircle.diameter)
    subCircle.diameter = 20
    print(subCircle.radius)
    
    //SubCircle setRadius
    //SubCircle getDiameter
    //Circle getDiameter
    //SubCircle getRadius
    //12
    //SubCircle setDiameter
    //Circle setDiameter
    //SubCircle setRadius
    //SubCircle getRadius
    //10
    

    重写类型属性

    • class 修饰的 计算类型属性可以 被子类重写
    • static 修饰的 类型属性(存储、计算)不可以被子类重写
    class Circle {
        static var radius: Int = 0
        class var diameter: Int {
            set {
                print("Circle setDiameter")
                radius = newValue / 2
            }
            get {
                print("Circle getDiameter")
                return radius * 2
            }
        }
    }
    
    class SubCircle: Circle {
        override static var diameter: Int {
            set {
                print("SubCircle setDiameter")
                super.diameter = newValue > 0 ? newValue : 0
            }
            get {
                print("SubCircle getDiameter")
                return super.diameter
            }
        }
    }
    

    属性观察器

    • 可以在子类中为父类属性(除了只读计算属性let 属性)增加属性观察器
    class Circle {
        var radius: Int = 2
    }
    
    class SubCircle: Circle {
        override var radius: Int {
            willSet {
                print("SubCircle willSet", newValue)
            }
            didSet {
                print("SubCircle didSet", oldValue, radius)
            }
        }
    }
    
    class Circle {
        var radius: Int = 2 {
            willSet {
                print("Circle willSet", newValue)
            }
            didSet {
                print("Circle didSet", oldValue, radius)
            }
        }
    }
    
    class SubCircle: Circle {
        override var radius: Int {
            willSet {
                print("SubCircle willSet", newValue)
            }
            didSet {
                print("SubCircle didSet", oldValue, radius)
            }
        }
    }
    
    class Circle {
        var radius: Int {
            set {
                print("Circle setRadius", newValue)
            }
            get {
                print("Circle getRadius")
                return 20
            }
        }
    }
    
    class SubCircle: Circle {
        override var radius: Int {
            willSet {
                print("SubCircle willSet", newValue)
            }
            didSet {
                print("SubCircle didSet", oldValue, radius)
            }
        }
    }
    

    final

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

    相关文章

      网友评论

          本文标题:Swift - 继承(Inheritance)

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