Swift学习_基本语法之继承&重写

Swift

1.继承

继承就是子类继承父类的属性、方法、下角标

class Person{

    var name:String
    var age:Int
    init(name:String,age:Int) {
    
        self.name = name
        self.age = age
    }

    func printName(){
        print("姓名:\(name) 年龄:\(age)")
    }
}

var onePerson = Person(name:"HarrySun",age:21)
print(onePerson.name,onePerson.age)     // 打印   HarrySun 21

现在以Person为父类继承一个子类教师

class Teacher:Person{

    var teacherID:Int = 0
    var schollName:String = ""

    func printSchoolName(){
    
        print("老师所在学校:\(schollName)")
    }
}

注:这里的老师类继承了属性name、age和方法printName,还有构造函数

var oneTeacher = Teacher(name:"刘老师",age:30)
oneTeacher.printName()  // 打印   姓名:刘老师 年龄:30
oneTeacher.schollName = "北京大学"
oneTeacher.printSchoolName()  // 打印   老师所在学校:北京大学

oneTeacher.name = "王老师"
oneTeacher.age = 40
print(oneTeacher.name,oneTeacher.age)   // 打印   王老师 40

我们可以继续再继承,往下可以定义一个英语老师继承自老师

class EnglishTeacher:Teacher{

    var englisLevel:String = ""
  
    func printEnglishLevel(){
    
        print(englisLevel)
    }
}

注:英语老师继承了Teacher继承于人的所有东西和自己添加的新属性和方法

var oneEnglishTeacher = EnglishTeacher(name:"John",age:25)
oneEnglishTeacher.name = "LEO"
oneEnglishTeacher.printName()   // 打印   姓名:LEO 年龄:25
oneEnglishTeacher.englisLevel = "8级"
oneEnglishTeacher.schollName = "哈佛大学"
oneEnglishTeacher.teacherID = 20170209
oneEnglishTeacher.printEnglishLevel()   // 打印   8级
print(oneEnglishTeacher.teacherID)      // 打印   20170209

2.重写

子类可以为集成来的实例方法、类方法、实例属性或下标脚本提供自己的定制实现。我们把这种行为叫重写(overriding)。

要重写某个特性,在其前面使用关键字override;
防止子类重写,在其前面使用关键字fina;
这里还需要注意的就是, 必须通过get和set这种特性的方式来重写父类的属性。

class Person2{

    var name:String
    var age:Int
    init(name:String,age:Int) {
    
        self.name = name
        self.age = age
    }

    func printInfo(){
    
        print("姓名:\(name),年龄:\(age)")
    }
}

class Teacher2: Person2 {

    var schoolName:String
    var teacherLevel:Int

    init(name:String,age:Int,schoolName:String) {
    
        self.schoolName = schoolName    // 这个属性要写在前面
        self.teacherLevel = 10
        super.init(name: name, age: age)
    }

    // 重写父类属性
    override var name: String{
    
            get{
            
                return super.name
            }
            set{
        
                super.name = "HarrySun"
            }
        }

    // 重写是方法名和参数还有返回值一致
    // 这个重写方法是加了一个学校信息的输出
    override func printInfo() {
    
        super.printInfo()
        print("学校名称:\(self.schoolName)")
    }

    // 用final定义表示防止子类重写
    final func printTeacherLevel(){
    
        print("老师等级\(self.teacherLevel)")
    }
}

var oneTeacher2 = Teacher2(name:"刘老师",age:30,schoolName:"清华大学")
oneTeacher2.printInfo()     // 打印姓名:刘老师,年龄:30   学校名称:清华大学


class EnglishTeacher2: Teacher2 {

    var englishLevel:Int = 0

//    override func printTeacherLevel(){
//        
//        print("老师等级\(self.teacherLevel)")
//    }
//    // 这里会报错,因为这个printTeacherLevel在父类是禁止重写的
}

var oneEnglishTeacher2 = EnglishTeacher2(name:"John",age:32,schoolName:"临沂大学")
oneEnglishTeacher2.englishLevel = 8
print(oneEnglishTeacher2.englishLevel)  // 打印   8

oneEnglishTeacher2.name = "Sun"
print(oneEnglishTeacher2.name)  // 打印   HarrySun

注:swift要求一个class自己的所有属性在使用之前必须先初始化,所以需要把super.init()放在下面,否则将报错。

Swift学习_基本语法之继承&重写_第1张图片


Swift学习_基本语法之继承&重写_第2张图片
此文章代码结果输出

小结

代码已上传至git:
--> 传送门:Swift_基本语法

附录

查看完整专栏《Swift学习》

有问题欢迎指正以及相互探讨 —— CoderSun

你可能感兴趣的:(Swift学习_基本语法之继承&重写)