继承
- 一个类可以继承另一个类,从而对原有类进行扩展和自定义
- 可以叫做子类和父类
- 继承的类让你可以重用被继承类的功能
- C#里,一个类只能继承于一个类,但是这个类却可以被多个类继承
多态
- 引用是多态的,类型为x的变量可以引用其子类的对象
- 因为子类具有父类的全部功能特性,所以参数可以是子类
- 但是反过来是不行的
引用转换
- 一个对象的引用可以隐式的转换到其父类的引用(向上转换)
- 想转换到子类的引用则需要显式转换(向下转换)
- 引用转换:创建了一个新的引用,它也指向同一个对象
向上转换
从子类的引用创建父类的引用
变量a依然指向同一个Stock对象(msft也指向它)
- 尽管变量a和msft指向同一个对象,但是a的可视范围更小一些
向下转换
- 从父类的引用创建出子类的引用
- 和向上转换一样,只涉及到引用,底层的对象不会受影响
- 需要显式转换,因为可能会失败
- 如果向下转换失败,那么会抛出 InvalidCastException(属于运行时类型检查)
as 操作符
- as 操作符会执行向下转换,如果转换失败,不会抛出异常,值会变为null
- as 操作符无法做自定义转换
is 操作符
- is 操作符会检验引用的转换是否成功。换句话说,判断对象是否派生于某个类(或者实现了某个接口)
- 通常用于向下转换前的验证:
- 如果拆箱转换可以成功的话,那么使用is操作符的结果会是true
is 操作符和模式变量
- C# 7里,在使用 is 操作符的时候,可以引入一个变量
- 引入的变量可以立即“消费”
virtual函数成员
- 标记为virtual的函数可以被子类重写,包括方法、属性、索引器、事件
override 重写
- 使用override修饰符,子类可以重写父类的函数
- virtual方法和重写方法的签名、返回类型、可访问程度必须是一样的
- 重写方法里使用base关键字可以调用父类的实现
注意
- 在构造函数里调用virtual方法可能比较危险,因为编写子类的开发人员可能不知道他们在重写方法的时候,面对的是一个未完全初始化的对象。
- 换句话说,重写的方法可能会访问依赖于还未被构造函数初始化的字段的属性或方法。