【C#学习记录】二、面向对象基础概念(2)


继承

基本概念

我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类

子类 派生类

父类 基类

子类继承了父类,那么子类从父类那里继承过来了什么?

首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。

问题:子类有没有继承父类的构造函数?
答:子类没有继承父类的构造函数,但是,子类会默认的调用父类无参数的构造函数,创建父类对象,让子类可以使用父类中的成员。
所以,如果在父类中重新写了一个有参数的构造函数之后,那个无参数的构造函数就被干掉了,子类就调用不到了,所以子类会报错,
解决办法:

  1. 在父类中重新写一个无参数的构造函数。
  2. 在子类显示的调用父类的构造函数,使用关键字:base()

继承的特性

  1. 继承的单根性:一个子类只能有一个父类。
  2. 继承的传递性
  3. 所有类都继承于object类
  4. 子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。

查看类图

visual studio2022看不了类设计器

关键字new

1. 创建对象
2. 隐藏从父类继承过来的同名成员

里氏转换

基本概念

  1. 子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替

    Student s = new Student();
    Person p = s;
    //Person p = new Student();
    
  2. 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。

    Student ss = (Student)p;
    
  3. is 和as

    1. is 表示类型转化,如果能够转换成功,则返回一个true,否则返回一个false

      if(p is Student)
      {
      	Student ss = (Student)p;
      }
      else
      {
      	Console.WriteLine("转换失败");
      }
      
    2. as 表示类型转换,如果能够转换则返回对应的对象,否则返回null

      Student t = p as Student;//将p转换成Student类
      

protected关键词

受保护的,可以在当前类的内部以及该类的子类中进行引用。

相关