01.继承的类型
- 单重继承 :表示一个类可以派生自一个基类。C#采用这种
- 多重继承:表示一个类派生自多个类,C#不支持多继承,允许接口多重继承。
- 多层继承:多层继承允许继承有更大的层次结构,类B派生自类A,类C又派生自类B,其中类B为中间基类。很常用
- 接口继承:允许多重继承,详见接口文章
补充:
结构继承自System.ValueType ,但是结构不支持继承,却可以实现任意多接口。
类继承自System.Object,不支持多继承,但是可以实现任意多接口。
02. 实现继承
如果一个类和接口都用于派生,那么类在前接口在后,中间用逗号分隔。
虚方法
把一个基类方法声明成 Virtual,就可以在任意派生类中重写该方法。
public class Shape
{
public virtual int X { get; set; } //基类中虚属性
public virtual void Draw()=> Console.WriteLine("基类中的方法....."); //基类中的虚方法
}
注意点:
成员字段和静态函数都不能声明为Virtual,只对类中的实例函数成员有意义。
重写基类方法的时候,方法的签名必须和基类中的完全匹配,否则以后创建的新成员就不能覆盖继承成员。
隐藏方法
如果签名相同的方法在基类和派生类中都有声明,但该方法并没有声明为Virtual或者override ,派生类方法就会隐藏基类方法。
或者使用new关键字,隐藏基类的方法。
调用基类方法
使用关键字base.MethodName()来调用基类中的方法,不仅可以调用重写的方法,任何方法都可以调用(包括属性)。
抽象类和抽象方法
C#允许把类和方法声明为abstract。抽象类不能实例化,而抽象方法不能直接实现,必须在非抽象的派生类中重写。抽象方法必须存在抽象类中。也就是说如果一个方法是抽象的,那这个类就一定是抽象的。反之,如果一个类是抽象的,那其中的成员不一定是抽象的。如果继承了抽象类,就必须实现其所有的抽象成员。
03.修饰符
访问修饰符 | 说明 |
---|---|
Public | 任何代码均可访问 |
Protected | 只有派生的类型才能访问该项 |
Internal | 只能在包含它的程序集中才能访问 |
Private | 在能在它所属的类型中访问 |
Protected Internal | 只能在该程序集和它的派生类型中访问 |
04.接口
接口关键字 interface,默认访问修饰符internal, 接口也是可以多继承的,和类相似。
//定义接口
public interface IDisposable
{
void Disposable();
}
//继承接口
public class SomeClass : IDisposable
{
//实现接口
public void Disposable()
{
throw new NotImplementedException();
}
}
05.is和as运算符
as 运算符 判断类型是否可以转换成功,如果成功就返回该类型,如果失败返回null
is 运算符 返回值是 bool 类型的
var rectangle = new Rectangle();
var en = rectangle as Shape;
if (en != null)
{
Console.WriteLine("转换成功....");
}