Swift - 继承(Inheritance)

继承(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))