美文网首页
12-Swift继承和重写

12-Swift继承和重写

作者: 一抹相思泪成雨 | 来源:发表于2020-12-17 08:15 被阅读0次

    1.继承

    • 值类型(枚举、结构体)不支持继承,只有类支持继承
    • 没有父类的类,称为:基类
    • Swift并没有像OC、Java那样的规定:任意类都最终都要继承自某个基类
    • 子类可以重写父类的下标、方法、属性,重写必须加上override关键字

    2.重写实例方法、下标

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

    3.重写属性

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

    4.重写实例属性

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

    5.重写类型属性

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

    6.重写属性

    • 子类可以将父类的属性(存储、计算)重写为计算属性
    • 子类不可以将父类属性重写为存储属性
    • 只能重写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
           }
       } 
    }
    
    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 }
       } 
    }
    

    7.重写类型属性

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

    8.属性观察器

    • 可以在子类中为父类属性(除了只读计算属性、let属性)增加属性观察器
    • will,willSet 和调用顺序不一样
    class TestCircle {
        var radius: Int = 1
    }
    class TestSubCircle: TestCircle {
        override var radius: Int {
            willSet {
                print("SubCircle willSetRadius", newValue)
            }
            didSet {
                print("SubCircle didSetRadius", oldValue, radius)
            }
        }
    }
    var testCircle = TestCircle()
    // SubCircle willSetRadius 10
    // SubCircle didSetRadius 1 10
    testCircle.radius = 10
    
    class TestCircle2 {
        var radius: Int = 1 {
            willSet {
                print("Cricle willSetRadius", newValue)
            }
            didSet {
                print("Circle didSetRaridus", oldValue, radius)
            }
        }
    }
    class TestSubCircle2: TestCircle2 {
        override var radius: Int {
            willSet {
                print("SubCircle willSetRadius", newValue)
            }
            didSet {
                print("SubCircle didSetRadius", oldValue, radius)
            }
        }
    }
    
    var testCircle2 = TestSubCircle2()
    // SubCircle willSetRadius 10
    // Circle willSetRadius 10
    // Circle didSetRadius 1 10
    // SubCircle didSetRadius 1 10
    testCircle2.radius = 10
    
    /// 3、
    class Circle3 {
        var radius: Int {
            set {
                print("Circle setRadius", newValue)
            }
            get {
                print("Circle getRadius")
                return 20
            }
        }
    }
    
    class SubCircle3: Circle3 {
        override var radius: Int {
            willSet {
                print("SubCircle willSetRadius", newValue)
            }
            didSet {
                print("SubCircle didSetRadius", oldValue, radius)
            }
        }
    }
    var circle3 = SubCircle3()
    // Circle getRadius
    // SubCircle willSetRadius 10
    // Circle setRadius 10
    // Circle getRadius
    // SubCircle didSetRadius 20 20
    circle3.radius = 10
    
    //4、
    class Circle4 {
        class var radius: Int {
            set {
                print("Circle setRadius", newValue)
            }
            get {
                print("Circle getRadius")
                return 20
            }
        }
    }
    class SubCircle4: Circle4 {
        override static var radius: Int {
            willSet {
                print("SubCircle willSetRadius", newValue)
            }
            didSet {
                print("SubCircle didSetRadius", oldValue, radius)
            }
        }
    }
    // Circle getRadius
    // SubCircle willSetRadius 10
    // Circle setRadius 10
    // Circle getRadius
    // SubCircle didSetRadius 20 20
    SubCircle4.radius = 10
    

    9.final

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

    相关文章

      网友评论

          本文标题:12-Swift继承和重写

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