C#_02.15_基础六_.NET类
一、类继承是一个类在另一个类的基础上进行的扩展。
继承的子类拥有父类的全部成员。索引子类拥有本身的全部成员以及父类的全部成员。
可以对基类成员进行隐藏,如果必须的话,方法是在子类中定义和父类成员一样签名的成员,并且在访问修饰符之前加入new关键字,就可以对父类的成员进行隐藏。
如果对于已经隐藏的父类成员后面需要进行访问,那么可以使用的方法是base关键字,base关键字注意点如下:
1、只能在子类当中使用,代表的是父类的成员;
2、调用基类成员的方法是使用“.”运算符。
如下:
二、类型转换的实质:
一个类的实例包含了他的基类的实例以及他本身成员的实例,如果我们获得了一个类的引用(就是实例创建表达式返回的值),那么就可以通过类型转换转换获得基类的实例的引用,在基类的实例的引用中是无法看到子类成员的。所以类型转换实质上是引用的转换,转换了引用之后,能够看到的成员就会发生改变。所以转换成父类的实例无法访问子类中的成员。因此我们有一个方法是可以改进这一点的,那就是使用 virtual 和 override 两个关键字使得在使用类型转换把子类转换成父类类型之后的实例可以访问子类的成员。
注意点:在覆写方法中,如果一个方法被通过基类调用,那么该方法被调用的顺序是从被转换成基类的哪一个实例的类型所在的层级开始想基类调用,调用遇到第一个override关键字的方法。
总结new 和virtual & override:
New的作用是隐藏父类中的成员,而override作用是使被转换成基类类型的子类对象仍旧可以使用子类的成员(方法,属性,字段......)。
三、创建一个实例的过程:
创建一个实例我们一直以为是先执行基类的构造函数然后执行子类的构造函数,一直以为构造函数是最先执行的,现在才明白原来错了,实例化一个对象我们最先执行的是对实例化成员进行实例化:如一个类当中声明了一些字段,那就是先执行这些字段的代码,但是这一过程调试是调试不出来的。
想想执行构造函数的时候那些我们声明或者已经初始化的字段属性是已经可以使用了的就可以理解了。
AND 构造函数执行的两个特殊点:
我们知道,创建类实例的时侯是先执行父类的构造函数再执行子类的构造函数,而我们又知道构造函数是无返回值但可以进行重载的函数,所以一个父类不一定只具有一个的构造函数,因此我们就需要指定我们到底是调用了哪一个的构造函数,使用的关键字是base。
使用方法就是在子类的构造函数名后面加上:“:base(参数列表)”,来一个eg:
AND:还有一个关键字“this”:这个关键字的作用是调用类本身的构造函数,使用的情境我理解为一个类有一些公共的成员需要进行初始化,又有很多的构造函数,如果我们每一个函数里面都写一遍那就变得很麻烦,代码又会出现冗余,因此选择的策略是弄一个公共的构造函数,使用this调用,调用方式和使用base是一样的,至于为啥要这么调用而不是选择在其他的构造函数里面调用这个公共的构造函数,因为编译器知道他是一个构造函数会进行优化,巴拉巴拉之类的我也不懂。
四、访问修饰符说明:
修饰符 |
可见性 |
private |
仅仅在当前类可见,子类其他类都不可见 |
protect |
在当前类和子类中都可见 |
internal |
在当前程序集中可见,其他程序集中不可见 |
protect internal |
当前程序集可见,其他程序集中继承这个类的子类也可见,这个访问级别是protect+internal的并集。 |
public |
没有访问限制 |
五、抽象成员:
抽象成员是指用abstract修饰的成员,不过要记得三个要点:
1) 抽象成员只能是函数形式的成员:比如说方法、事件、属性、索引器,而不能是字段常量;
2) 必须使用abstract修饰;
3) 必须不能够写方法体,只能够有函数名字;
# |
virtual |
abstract |
含义 |
虚对象, |
抽象成员 |
使用对象 |
事件方法属性索引器 |
事件属性方法索引器 |
不能使用 |
字段、常量 |
字段、常量 |
覆写 |
非必须 |
必须被覆写 |
方法体 |
有方法体 |
不能写方法体 |
类注意 |
无需添加其他 |
类必须声明成抽象类,添加abstract修饰符 |
六、抽象类:
抽象类只能够被继承而无法实例化,必须使用关键字abstract修饰,只要一个类当中有抽象成员那么这个类就是抽象类,抽象类可以继承自另一个抽象类,继承的抽象类不需要覆写当中的抽象成员,但是如果继承抽象的的类不在是抽象了就需要覆写该抽象类中的所有抽象成员。
七、密封类:
由sealed修饰的类成为密封类;密封类的特点是不可以被继承而只能够被实例化。
八、静态类:
静态类是用static修饰的类,在静态类中所有的成员都是静态的,静态类不能够被继承,静态类通常是一组数学方法或者是数据。静态类可以用静态的构造函数,但是不能有实例化的构造函数,静态类是不能创建实例的。一个典型的静态类是扩展方法。
九、扩展方法:
扩展方法三个点:
1) 必须是在静态类中的;
2) 必须是静态方法的;
3) 必须使用关键字this;