override关键字详解(转载)
前言
C# 中有重写、重载、覆写的概念,分别对应的关键字是override、overload、new,在本文中主要介绍 override 关键字,主要参考了此篇文章C# 重写(override)。
正文
1、重写、重载、覆写简介
1.重写(override)
重写(override):子类对父类中方法进行按照自身需要进行对方法体进行重写,重写方法与父类方法在访问权限、返回值、方法名以及参数不变。
2.重载(overload)
重载(overload):在一个类中对同一方法名按照不同的需求编写出多个方法,方法名相同,但是参数的类型或者个数不能相同,返回值类型不能作为重载的标志。
3.覆写(new)
覆写(overwrite):用 new 实现。在子类中用 new 关键字修饰定义的与父类中同名的方法,也称为覆盖,覆盖不会改变父类方法的功能。
2、重写的具体示例
using System;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
A a = new B();
a.Print();
}
}
class A
{
public A()
{
//构造函数
Print();
}
public virtual void Print()
{
Console.WriteLine("我是A类");
}
}
class B:A
{
public B()
{
//构造函数
Print();
}
public override void Print()
{
Console.WriteLine("我是B类"); //重写Print()方法
}
}
}
在上段代码中,A类是父类,B类是子类,重写了A类中的 Print() 方法。
3、对父类方法进行重写的条件
- 父类中方法必须被 virtual 关键字修饰的方法才能被子类重写,如果父类方法没有使用 virtual 关键字,在子类中重写父类方法时就会编译错误;
- 虚方法:基类中定义的允许在派生类中重写的方法,使用virtual关键字定义;
- 在子类中对父类进行重写时,需要使用 override 关键字作为标识;
- 例如 B 类继承 A 类,并重写 A 类中 Print() 方法时,没有使用 override 关键字的的话会出现下列的警告。
4、父类方法被子类重写之后,通过创建子类对象指向父类时,调用重写方法时,调用的是父类还是子类的方法
当父类方法被子类重写之后,只要创建子类的实例,当调用被重写的方法时,最终运行的都是子类中的方法。
代码运行的结果:
- 在创建子类的实例时,首先运行子类中的构造函数,但是会先执行父类中的构造函数;
- 当执行父类中构造函数中 Print() 方法时,先判断 Print() 方法是否已经被重写,如果该方法被重写的话,则会执行子类中重写的方法;
- 执行完成父类的构造函数之后,就会执行子类中构造函数,子类构造函数调用 Print() 函数时,会先判断子类中是否含有 Print() 方法,有的话则会调用自身的 Print() 方法,否则调用父类中 Print() 方法;
- 最后 a.Print() 也是首先判断A类中 Print() 方法是否被重写,如果被重写的话则调用B类中 Print() 方法。
5、子类中的重写方法被new关键字而不是override关键字修饰时,父类中方法是否被重写
不会被重写,被 new 关键字修饰后,Print() 方法不是重写方法,而是B类中的新方法。
通过上图的运行结果,说明当使用了 new 关键字之后,只要跟父类有关,运行的 Print() 方法都是运行父类中 Print() 方法。