继承 多态
abstract
抽象函数是隐式的虚函数,可以理解为没有方法体的虚函数,而且继承他的类必须实现它。
若一个类中的全部成员都是抽象的,类也必须声明为abstract
密封类:不能被继承的类,修饰词为 sealed
方法覆盖:继承中的方法覆盖,必须在基类中使用关键字virtal ,在子类中使用关键字 override ,以区分新建一个行为的同名函数。虚方法不能为private,override方法必须与虚方法的名字、参数列表、返回类型完全一致。可以使用virtual修饰的包括非静态方法、非静态属性、非静态索引器。
访问修饰符:internal protected 提供了内部(同一集合)或者受保护两种访问方式,也就是internal或者protected,而不是internal且protected
派生类的构造函数:在子类的构造函数中添加父类构造函数的初始化器,
形式为Constructor(param1,param2,param3..):base(param1,param2...)
Base关键字:
通过使用此关键字子类可以调用基类的成员,包括函数变量,还有索引器。索引器也是可以继承的,可以使用base[index]来调用基类的索引器访问索引器的数据集合。
多级继承:可以使用后代类型对象给一个祖先类型变量赋值,但是祖先类型变量还是祖先类型,只能访问祖先类型的成员。所以要实现动态绑定需要在父类中定义抽象方法,并通过动态绑定自动调用引用对象的具体方法。这也就是多态。
多态:通过动态绑定原理,使用单个变量来引用不同的对象,自动调用引用对象类的对应方法。动态绑定石指计算机发生的过程,而多态是用于对象和类的抽象讨论。可以用子类对象初始化父类对象,但是此对象仍然是父类类型对象,所以只能调用父类中有定义的成员。
is 操作符:可以判断当前对象的类型,在下降类型转换中使用,返回值为true false
as 操作符:也可以判断当前对象类型,并且如果符合子类型就可以自动转化,不符合的话返回null
ps:以上两操作符对于接口转换同样适用。
虚函数和非虚函数:
默认为非虚函数,在子类中如果出现和父类中相同参数以及返回类型的函数,必须使用关键字new进行隐藏,而不会执行动态绑定。如果是虚函数使用override进行覆盖,将执行动态绑定。
之所以默认为非虚函数,是为了在版本控制中不要如果出现基类升级,在编译时会提醒程序开发人员进行升级,若为虚函数的话讲默认为子类将其覆盖;而且虚函数执行速度也慢。
关于多重继承:和java一样c# 不支持多重继承,而是使用接口。
接口的定义:接口的访问修饰符默认为public,且只能添加public
接口中的 函数 方法 存取器等等都不能添加访问修饰符,默认为public abstract
接口的显式调用:
接口的实现分为:隐式实现和显式实现。如果类或者结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口那么接口中相同名称成员就要显式实现。显示实现是通过使用接口的完全限定名来实现接口成员的。 【接口名.成员名】
显式实现方式不能用public、abstract、virtual、new来修饰;而且调用的时候不能直接用实现接口的对象直接调用,而是必须提升为接口类型后进行调用。