一、继承的类型
C#采用单重继承(一个类可以派生自一个基类),不支持多重继承(一个类派生自多个类),但是允许接口的多重继承。
多层继承允许继承有更大的层次结构,如类B派生自类A,类C又派生自类B。
C#允许类型派生自多个接口。一个类型可以实现多个接口。
C#类可以派生自另一个类和任意多个接口。
准确地说,因为System.Object是一个公共的基类,所以每一个C#类(除Object类)都有一个基类,还可以有任意多个接口。
结构不支持实现继承,但支持接口继承。
结构总是派生自System.ValueType
,它们还可以派生自任意多个接口。
类总是派生自System.Object
或用户选择的另一个类,它们还可以派生自任意多个接口。
二、继承的实现
1.如果类和接口都用于派生,类总是必须放在接口的前面。
2.【无论是用public还是private修饰的构造方法都不能被继承】
【成员变量都能被继承,private类型不能直接访问,需要借助公有的get和set方法来调用】
【private修饰的成员方法不能被继承】
3.基类方法声明为virtual,就可以在任何派生类中重写该方法。
可以把virtual与表达式体方法一起使用当实现代码只有一行的时候。
4.可以将属性声明为virtual,对于虚属性与重写属性,语法要与非虚属性相同且添加关键字virtual。
public virtual Size Size { get; set; }
5.C#中,函数在默认情况下不是虚拟的,但(构造函数除外)可以显示的声明为virtual。
6.重写基类方法的时候,所有参数类型和方法名以及返回类型必须完全匹配,否则,以后创建的新成员就不覆盖基类成员。
7.使用多态性,可以动态的定义调用的方法,而不是在编译期间定义。编译器创建了一个虚拟方法表,列出了可以在运行期间调用的方法,它根据运行期间的类型调用方法。
8.如果签名相同的方法在基类和派生类中都进行了声明,但是该方法没有分别声明为virtual和override,派生类方法会隐藏基类方法。
9.C#中base.<MethodName>()
可以用于从派生类中调用方法的基类版本。
使用base关键字,可以调用基类的任何方法——-不仅仅是已经重写的方法。
10.抽象类不能实例化。
抽象方法不能实现,必须在非抽象的派生类中重写。
11.如果类包含抽象方法,那么类也是抽象的,必须声明为抽象。
12.从抽象基类中派生类型时,需要实现所有抽象成员,否则编译器会报错。
13.给类添加sealed修饰符,就不允许创建该类的子类。密封一个方法,表示不能重写该方法。