CSharp Basic Tutorial Chapter-3-5 继承 多态 引用转换 virtual


继承

  • 一个类可以继承另一个类,从而对原有类进行扩展和自定义
  • 可以叫做子类和父类
  • 继承的类让你可以重用被继承类的功能
  • C#里,一个类只能继承于一个类,但是这个类却可以被多个类继承

1

多态

  • 引用是多态的,类型为x的变量可以引用其子类的对象

2

  • 因为子类具有父类的全部功能特性,所以参数可以是子类
  • 但是反过来是不行的

3

引用转换

  • 一个对象的引用可以隐式的转换到其父类的引用(向上转换)
  • 想转换到子类的引用则需要显式转换(向下转换)
  • 引用转换:创建了一个新的引用,它也指向同一个对象

向上转换

  • 从子类的引用创建父类的引用
    4

  • 变量a依然指向同一个Stock对象(msft也指向它)

5

  • 尽管变量a和msft指向同一个对象,但是a的可视范围更小一些

6

向下转换

  • 从父类的引用创建出子类的引用

7

  • 和向上转换一样,只涉及到引用,底层的对象不会受影响
  • 需要显式转换,因为可能会失败
  • 如果向下转换失败,那么会抛出 InvalidCastException(属于运行时类型检查)

8

as 操作符

  • as 操作符会执行向下转换,如果转换失败,不会抛出异常,值会变为null

9

  • as 操作符无法做自定义转换

10

is 操作符

  • is 操作符会检验引用的转换是否成功。换句话说,判断对象是否派生于某个类(或者实现了某个接口)
  • 通常用于向下转换前的验证:

11

  • 如果拆箱转换可以成功的话,那么使用is操作符的结果会是true

is 操作符和模式变量

  • C# 7里,在使用 is 操作符的时候,可以引入一个变量

12

  • 引入的变量可以立即“消费”
    13

virtual函数成员

  • 标记为virtual的函数可以被子类重写,包括方法、属性、索引器、事件

14

override 重写

  • 使用override修饰符,子类可以重写父类的函数

15

  • virtual方法和重写方法的签名、返回类型、可访问程度必须是一样的
  • 重写方法里使用base关键字可以调用父类的实现

注意

  • 在构造函数里调用virtual方法可能比较危险,因为编写子类的开发人员可能不知道他们在重写方法的时候,面对的是一个未完全初始化的对象。
  • 换句话说,重写的方法可能会访问依赖于还未被构造函数初始化的字段的属性或方法。

demo1
demo2


文章作者: Chaoqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chaoqiang !
评论
 上一篇
CSharp Basic Tutorial Chapter-3-6 继承  抽象  隐藏成员 new sealed base 初始化顺序 CSharp Basic Tutorial Chapter-3-6 继承 抽象 隐藏成员 new sealed base 初始化顺序
抽象类和抽象成员 使用abstract声明的类是抽象类 抽象类不可以被实例化,只有其具体的子类才可以实例化 抽象类可以定义抽象成员 抽象成员和virtual成员很像,但是不提供具体的实现。子类必须提供实现,除非子类也是抽象的 隐藏被继承
下一篇 
CSharp Basic Tutorial Chapter-3-4 常量  静态构造函数和类  终结器  局部类和方法 nameof CSharp Basic Tutorial Chapter-3-4 常量 静态构造函数和类 终结器 局部类和方法 nameof
常量 一个值不可以改变的静态字段 在编译时值就已经定下来了。 任何使用常量的地方,编译器都会把这个常量替换为它的值 常量的类型可以是内置的数值类型、bool、char、string或enum 使用const关键字声明,声明的同时必须使用具体
  目录