![cover](https://img-blog.csdnimg.cn/img_convert/e19600e0c7a54c90b8bb4065ad4c5aff.png)
【C#学习笔记(一)】override关键字详解(转载)
C# 中有重写、重载、覆写的概念,分别对应的关键字是override、overload、new,在本文中主要介绍 override 关键字,主要参考了此篇文章C# 重写(override)。
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() 方法。
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)