Swift学习笔记13——类继承(Inheritance)

继承是类独有的,结构体和枚举类都不具有这个功能。

继承就好像子承父业一样,一个继承的类(称为子类subClass)可以获得被继承的类(称为父类superClass)的属性,方法和其他特性。

子类可以重写父类的方法,也可以添加自己的属性,还可以为继承而来的属性添加观察器(对继承而来的存储和计算属性都可以)


基类

一个不继承自任何类的类称为基类。在Swift中,是没有共同的终极父类的。oc和java都是有终级父类的。下面定义一个Animal基类。

class Animal {
    var life : Int = 0
    var description: String{
        return "An animal with a life of \(life)"
    }
    
    func makeSounds() {
    
    }
}

继承语法

class Dog: Animal {
    var name : String = "larry"
}

上面的Dog类继承自Animal类,并且添加了自己的name属性。我们可以修改一下dog继承的属性,然后打印一下

var dog = Dog()
dog.life = 10
print("dog's life is",dog.life)  //dog's life is 10

覆盖(override)父类属性

对于继承而来的存储属性或者计算属性,我们可以通过重写这个属性的getter和setter方法来实现覆盖。下面是几条规则:

1、当你重写了setter方法的时候,一定要重写getter方法。但是可以只重写getter方法。

2、覆盖属性的时候,属性名和类型都必须和继承的属性一致才算覆盖。并且前面要加上override关键字。

3、你可以将继承的只读属性重写为读写属性,但是不能将继承的读写属性重写为只读属性。

下面重写Animal的description属性

class Dog: Animal {
    var name : String = "larry"
    override var description: String {
        get{
            return "It's a dog with the name of \(name)"
        }
    }
}

覆盖属性观察器

规则:

1、不能对继承的常量,或者只读属性添加属性观察器

2、不能同时对一个继承属性同时添加属性观察器和setter方法。因为setter方法已经可以提供属性观察器的功能。

3、即使覆盖了之后,如果父类的该属性有观察器,那么当值修改的时候,父类的观察器也会被调用。

class Dog: Animal {
    var name : String = "larry"
    
    override var life: Int {
        didSet{
            print("The dog's life is \(life)")
        }
    }
    
    override var description: String {
        get{
            return "It's a dog with the name of \(name)"
        }
    }
    
}

覆盖父类方法

同样的,加上override后,重写父类方法就可以

override func makeSounds() {
        print("wang! wang!")
}


防止覆盖

使用final关键字去修饰就可以了。比如final varfinal func, final class func, final subscript



你可能感兴趣的:(Swift学习笔记)