8-类的继承

import UIKit

var str = "Hello, playground"


// 1 类的继承
// 继承只能发生在类类型上,不能发生在枚举和结构体上面

// 2 构造器过程中的安全检查
// 类的构造过程有一下
// 第一步:类的构造过程中包含两个阶段,第一步分配内存,初始化子类存储属性,沿着构造器链向上初始化父类存储属性。
// 第二步:从顶部构造器链往下,对每个类进行进一步修改存储属性,调用实例方法等处理。

// 创建一个person 类
class Person {
    var name:String;
    var age:Int;
    
    init() {
        self.name = "";
        self.age = 12;
        
    }
}


// 创建一个Student 继承
class Student:Person{
    var school: String;
    override init() {
        // 安全检查第一步,确保子类所有的属性初始完成之后,才可初始化父类的属性
        // 子类的初始化属性 必须放在向上调用父类构造器代理之前
        // 也就是 放在super.init 之前
        school = "Peking";
        super.init();
        
        // 安全检查第二步 为继承的属性设置新的值放在调用super.init之后
        self.name = "Klay";
    }
    
    // 3 便利构造器
    // 便利构造器必须小调用其他构造器代理人,然后再为任意属性赋新值
    convenience init(name:String) {
        self.init();
        self.name = name;
    }
    
}

var s = Student(name: "curry");
print(s.name);

// 3 构造器继承
// 类的构造器来源有两种,自己编写和父类继承,继承的条件
// 如果子类没有指定构造器 自动继承父类的构造器
// 如果子类提供了所有父类指定构造器的实现,无论是通过条件1继承过来的,还是通过自己编写的,都自动继承父类所有父类的便利构造器


// 4 重写
// 一个类继承另外一个类的属性

// 4.1 属性重写

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

class S1:P1{
    
    var schoole:String;
    
    // 重写子类的属性
    override var age: Int{
        get{
            return super.age;
        }
        
        set{
            super.age = newValue < 12 ? 12 :newValue;
        }
    }
    
    init(name: String, age: Int,schoole:String) {
        self.schoole = schoole;
        super.init(name: name, age: age);
    }
}

var s1 = S1(name: "Mike", age: 85, schoole: "kkk");
s1.age = 2;
print(s1.age);



// 4.2 方法重写
// 在子类中重写父类继承来的实例方法和静态方法
class P3 {
    var name:String;
    var age:Int;
    init(name:String,age:Int) {
        self.name = name;
        self.age = age;
    }
    
    func printInfo() -> () {
        print("name--\(self.name),age---\(self.age)");
    }
    
    class func sayHi() -> ()
    {
        print("hello , i am parrent");
    }
    
}

class S3:P3{
    
    // 重写实例方法
    override func printInfo() ->() {
        print("Child Print name--\(self.name),age---\(self.age)");
    }
    
    // 重写静态方法
    override class func sayHi() -> ()
    {
        print("hello , i am child");
    }
    
}

var s3 = S3(name: "ANT", age: 12);
s3.printInfo();
S3.sayHi();

// 4.3 下标重写

// 在类的定义前面使用final 关键字,表示此类不能别继承

// 5 类型检查与转换
// 5.1 is 操作符 判断一个实例是否是某个类的类型 是的话返回true
if s3 is S3{
    print(true)
}

// 5.2 使用as操作符
// 对象类型转换一定发生在继承的前提下

// 5.3 Any 和 AnyObject

// AnyObject 可以表示任何类的实例
// Any 可以表示任何类型 包括类和其他数据类型 Int Double 等基本数据类型


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值