C#构造函数、继承与多态

构造函数

  • 构造函数就是一个对象的初始操作的函数,new对象()的时候调⽤,方法名必须与类一样,且没有返回值类型
  • 构造函数⼀般都是public,因为⼀旦构造函数被设置为了private,那么外界就⽆法new这个对象了
  • 如果一个类没有构造函数,那么系统会自动写一个空参数空方法体的构造函数
  • 构造函数是可以重载的,如果想在执行当前构造函数之前,先执行构造函数:当前构造函数(…) : this(传实参)
  • 示例:
public Person(string name)
{
    this.name = name;
}
public Person(string name,int age):this(name){
    this.age = age;
}

继承

  • class 类名 : 继承的类名
  • C#语言只支持单继承,不支持多继承,只能继承一个类
  • 基类:被继承,但自身没有继承别人
  • 子类在实例化的时候,除了调用自己的构造函数,还会调用父类的构造方法,以及父类的父类的构造方法
  • 关于构造函数的执行顺序:一个子类对象被实例化的时候,先实例化一个父类的对象(执行父类的构造方法),然后才实例化子类的对象(执行子类的构造方法)
  • public和protected可以被继承,子类的子类也可以
  • 关于子类的构造函数该如何创建:子类至少要有一个和父类匹配上的构造函数,如果构造函数有参数,则还需要先调用父类的构造函数并传参数,然后在调用子类的构造,调用方式:public ⼦类名(参数列表) : base(参数列表)
public Person(string name)
{
    this.name = name;
} 
public Programmer(string name, int age,string language) : base(name)
{
    this.language = language;
} 

多态

一、子类对象与父类对象之间的转换

  • 什么是多态:同一类对象,做同一件事情,表现出不同的状态
  • 子类对象转换为父类对象:可以隐式转换
//HeNanPerson继承Person
Person xiaoming = new HeNanPerson("小明"); 
  • 父类对象转换为子类对象:需要强制转换,有两种方式
HeNanPerson xiaogang = (HeNanPerson)new Person("小刚"); //(要转换的类型)对象
HeNanPerson xiaogang = new Person("小刚") as HeNanPerson; //对象 as 要转换的类型【仅限引⽤类型】
  • 强制转换可能会转换失败,所以强制转换之前需要先进⾏类型判断,判断是否可以转换成功:对象 is 类型【仅限引⽤类型】
  • 如果转换失败,则转换后的对象为null
    在这里插入图片描述

二、关于⽗类空参数构造函数的调⽤说明

  • ⼦类在实例化的时候,必会调⽤⽗类的构造函数,⼦类在声明构造函数的时候,要想办法调⽤⽗类的构造
  • 如果⽗类是空参数的构造函数 : 可以不写,默认调用,也可写 base()
  • 如果⽗类是有参数的构造函数,那么⼀定概要通过base的⽅式调⽤,传参

三、⼦类⽅法的覆盖

  • 前提条件:⽗类中有⼀个public函数,⼦类中没有该函数
  • 在子类中写同名同形参的函数,此时,⼦类对象调⽤⼦类的该函数,⽗类对象调⽤⽗类的该函数,这种⼦类函数,可以称之为覆盖
  • ⼦类在书写该函数的时候,规范的写法应该是:[访问修饰符] new 返回值类型 函数名(参数列表)
  • 覆盖:⼦类也有该函数了,以后调⽤的时候就调⽤⼦类的该函数

三、⼦类⽅法的重写(表现出多态)

  • 如果⽗类想要⼦类可以重写该函数,该函数必须是虚函数、抽象函数,或者父类中的该函数是重写的父类的父类中的函数
  • 父类函数应为:[访问修饰符] virtual(abstract override) 返回值类型 函数名(参数列表)
  • 子类重写:[访问修饰符] override 返回值类型 函数名(参数列表)
  • 重写后,⼦类的对象,⽆论是不是转换成了⽗类的类型,都会执⾏重写后的该函数
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章