美文网首页
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继承和重写

    1.继承 值类型(枚举、结构体)不支持继承,只有类支持继承 没有父类的类,称为:基类 Swift并没有像OC、Ja...

  • Python 继承和重写

    继承与重写 1.重写 继承后,子类可以拥有除父类继承的内容以外的其他内容。 1.关于方法 a.在子类中可以直接添加...

  • 继承和重写 kt 中使用 :(冒号) 代替 java 中的 extends 和 implements 重写父类的方...

  • 重写继承

    重写是父类的行为满足不了子类的需求时 需要重写 继承是只要定义一次 比如猫类会吃 跑 睡 下面就是只要调用上面...

  • 继承 ---- 重写

    继承: 只有private修饰的成员不能被继承java支持单继承,多重继承(多层次继承),不支持多继承(一个子类有...

  • 继承,重写

    最近学习javaweb突然发现很多java的知识掌握的不牢,所以又回去复习了一下java的基础知识,感觉收获颇深,...

  • Java创建线程基本思路

    创建通过继承类Thread()和接口Runnable。 一、继承Thread 重写void run(){}...

  • Swift 中的一些关键字

    open:可以在任何地方访问、继承和重写 public:可以在任何地方被访问,在其他模块不能被继承和重写 inte...

  • 面向对象的基本原则

    基本要素: 封装 , 继承 , 多态 多态 : 注意重写和重载 重写: 子类重写父类的方法 重载: 同样的方法名 ...

  • 继承、多态、重载和重写

    什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承、多态、...

网友评论

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

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