构造函数
- 构造函数就是一个对象的初始操作的函数,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 返回值类型 函数名(参数列表)
- 重写后,⼦类的对象,⽆论是不是转换成了⽗类的类型,都会执⾏重写后的该函数