swift 继承

这是我参与更文挑战的第14天,活动详情查看: 更文挑战

概念

  • 继承:一个类可以从另一个类继承方法、属性和其他特性
  • 子类:继承的类
  • 父类:被继承的类
  • 基类:没有父类的类
  • 子类可以调用和访问属于其超类的方法,属性和下标,并且可以重写这些方法,属性和下标的自己的重写版本,以优化或修改它们的行为
  • 子类中可以为继承来的属性添加属性观察器,当属性值改变时,类就会被通知到
  • 值类型(枚举、结构体)不支持集成,只有类支持继承

子类化

  • 子类化就是在现有类的基础上创建新类的行为
  • 子类继承父类的特征,然后可以对其进行细化。还可以向子类添加新特性
//父类
class Student {
    var name = ""
 
    func todoHomework(){
        print("\(name) 写作业")
    }
}

//子类
class Boy: Student{
    var hobby = ""
    
    func paly() {
        print("\(name) 踢足球")
    }
}

let boy = Boy()
boy.name = "李雷"
boy.todoHomework()
boy.paly()

log:
李雷 写作业
李雷 踢足球
复制代码

重写

子类可以重写父类的下标、方法、属性

  • 重写实例方法,使用关键字override修饰

    class Student {
        func play(){
            print("就是玩儿!")
        }
    }
    
    class Boy: Student{
        override func play() {
            print("踢足球")
        }
    }
    
    let boy = Boy()
    boy.play()
    
    log:
    踢足球
    复制代码
  • 重写实例属性

    • 子类可以将父类的属性(存储、计算),重写为计算属性
    • 子类不可以将父类的属性(存储、计算),重写为存储属性
    • 只能重写var属性,不能重写let属性
    • 重写时属性名、类型要一致
    • 子类重写后的属性权限不能小于父类的权限
    • 如果父类属性是只读的,那么子类重写后的属性可以是只读的、也可以是可读可写的
    • 如果父类属性是可读可写的,那么子类重写后的属性也必须是可读可写的
    class Student {
        //存储属性
        var name = ""
        //只读属性
        var hobby : String {
            return self.name
        }
    }
    
    class Boy: Student{
        //重写属性,将父类存储属性重写为计算属性
        override var name: String {
            set {
                self.name = newValue
            }
            get {
                return self.name
            }
        }
        //重写属性,将父类只读属性重写为可读可写
        override var hobby: String {
            set {
                self.name = newValue
            }
            get {
                return self.name
            }
        }
    }
    
    var boy = Boy()
    boy.name = "李雷"
    boy.hobby = "踢足球"
    复制代码
  • 重写类型方法

    • class修饰的类型方法、下标,允许被子类重写
    • static修饰的类型方法、下标,不允许被子类重写
    • 如果父类定义方法时使用class修饰,子类重写时可以使用class也可以使用static来修饰
  • 重写类型属性

    • class修饰的计算类型属性,可以被子类重写
    • static修饰的类型属性(存储、计算),不可以被子类重写
    class Student {
        //static 子类无法重写
        static var name = ""
        class var hobby :String {
            set {
                self.hobby = newValue
            }
            get {
                return self.hobby
            }
        }
    }
    
    class Girl: Student{
    
        override static var hobby: String{
            set {
                super.hobby = newValue
            }
            get {
                return super.hobby
            }
        }
    }
    
    Girl.name = "han meimei"
    Girl.hobby = "游泳"
    print(Girl.name)
    print(Girl.hobby)
    
    log:
    韩梅梅 爱好 游泳
    复制代码

防止重写(final

  • final修饰的方法、下标、属性,禁止被重写
  • final修饰的类,禁止被继承
class Student {
    var name = ""
    
    //无法被继承
    final func play(){
        print("就是玩儿")
    }
}

class Boy: Student {
    override var name: String{
        get {
            return super.name
        }
        set {
            super.name = newValue
        }
    }
    
    //用final修饰的方法,子类无法重写,编译器提示错误为`Instance method overrides a 'final' instance method`
//    func play() {
//        print("不让玩儿")
//    }
    
}

var boy = Boy()
boy.name = "李雷"
boy.play()
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享