1. 类的封装
1.1 封装概述
- 添加local就无法在外部通过句柄访问内部变量,但是可以通过类的方法访问这种变量。
- D。实际上编译不通过。
- public不是SV的关键词。
1.2 定义成员方法
- 本例子中的方法是动态的,因此若要调用就必须实例化对象。
- 若我们不定义new,系统会自动帮助我们定义一个空的new。
1.3 类与结构体、module的异同
- B:静态句柄是可以存在的,同时new,那就会在编译的时候例化对象。
1.4 类的辨析
- 索引变量原则:由近到远。
- this.name = name中后一个name是string name,this.name是当前类的成员变量。
2. 类的继承
2.1 概述
- 黑猫白猫都是猫的子类,因此猫的protected属性和公共的方法都可以被子类调用。this.color就是指子类从父类中继承的color属性。
- local型变量只能通过父类的方法对其进行操作。
- D
2.2 类继承案例1
- this表示当前类中寻找要使用的方法或者属性
- super表示要找到当前类的父类,在子类同名方法中,先调用父类的方法,之后添加子类自己的方法内容。子类的方法继承父类方法必须要有super。
- 当BadTr想调用属性crc时,有三种方式:
- this.crc:找到本类中的crc,其实是找到从父类中继承得到的crc属性
- super.crc:直接去父类找crc
- crc:由近到远去找crc
2.3 类继承案例2
- super表示子类的方法对父类做了继承
- new有三个任务:开辟空间、成员变量初始化、返回句柄
- 若子类中的new函数中没有super.new,那就是不去按照父类new函数中的命令去进行变量初始化等任务,但是父类中的成员变量与方法的空间也会开辟,也可以返回句柄。
- 一般子类中的new函数会将super.new写在第一行
2.4 成员覆盖
- 子类的句柄可以赋值给父类的句柄,父类和子类的句柄都指向同一个对象。但是由于t是父类句柄,他只可以指向父类所包括的属性和方法,wr是子类句柄可以指向父子所有的属性和方法。wr.super.def即可访问父类的def。
- 假设有一个子类句柄wr2,wr2 = t是不允许的(对于编译器无法得知应该指向纯父类对象空间还是子类对象空间);使用$cast(wr2,t)可以通过动态检查的方式,看当前t的具体指向来将父类句柄赋值给子类句柄,若t指向父类对象,返回0赋值失败,若t指向子类对象,返回1赋值成功。
- 打印值分别为200,100