浅谈C#中虚方法与隐藏方法的区别

前言:本博文讲解了C#中虚方法与隐藏方法的概念、定义以及区别。两者的细则之处,更是值得您反复推敲!

一、虚方法

1、概念讲解

在我们的C#编程中,把一个基类函数声明为virtual,这样我们就可以在它的任何派生类中重写该函数。同时,我们在其派生类中重写另外一个函数时,要使用override关键字显示声明。重写之后,原来的方法就不存在了。

2、示例讲解

  1. 首先,我们创建基类Person与派生类Student。并添加它俩相同的方法Run,我们设置基类Person的Run方法为虚函数,并让其派生类Student的Run方法进行重写。
class Person
{
    public virtual void Run()
    {
        Console.WriteLine("我是Person的成员方法,我可以跑~");
    }
}
class Student : Person
{
    public override void Run()
    {
        Console.WriteLine("我是Student的成员方法,我可以跑~");
    }
}
  1. 实例化一个学生stu1,调用它的Run方法。
Student stu1 = new Student();
stu1.Run();
  1. 执行结果,如下:
    在这里插入图片描述
  2. 我们改变上面的代码,看一下效果。
Student stu1 = new Student();
stu1.Run();
Person p1 = new Person();
p1.Run();
Person p2 = new Student();
p2.Run();
  1. 再次执行,结果如下:
    在这里插入图片描述

3、总结一下

我们在派生类里面重写虚函数之后,不管在哪里调用,只要是用派生类的构造函数实例化的对象,它都是调用重写之后的方法。但是如果我们调用的是基类构造的对象,此时它的派生类并没有重写虚方法,此时仍然调用基类的虚方法。

二、隐藏方法

1、概念讲解

如果签名相同的方法在基类和派生类中都进行了声明,但是该方法没有分别声明为virtualoverride,派生类就会隐藏基类方法(要使用new关键字进行声明)。隐藏的话,也就是看不到了,实际这个方法还存在。

2、案例讲解

  1. 和上面的案例一下,改动如下:
class Person
{
    public void Run()
    {
        Console.WriteLine("我是Person的成员方法,我可以跑~");
    }
}
class Student : Person
{
    public void Run()
    {
        Console.WriteLine("我是Student的成员方法,我可以跑~");
    }
}

注意:其派生类中的方法,new可写可不写,此时基类的方法为隐藏方法,如下:

public new void Run(){}
public void Run(){}
  1. 很明确,我们去掉了virtualoverride,此时这两个方法的签名完全相同,我们再用其派生类进行调用。
Student stu1 = new Student();
stu1.Run();
  1. 执行结果,如下:
    在这里插入图片描述
  2. 我们改变上面的代码,看一下会效果。
Student stu1 = new Student();
stu1.Run();
Person p1 = new Person();
p1.Run();
Person p2 = new Student();
p2.Run();
  1. 再次执行,结果如下:
    在这里插入图片描述

3、总结一下

如果使用派生类声明的对象,调用隐藏方法会调用派生类的,如果使用基类声明对象,那么就会调用基类的隐藏方法。

三、虚方法与隐藏方法的区别

1、重写和隐藏的定义

  1. 重写:继承时发生,在派生类中重新定义基类中的方法,派生类中的方法和基类的方法是一样的 。例如:基类方法声明为virtual(虚方法),派生类中使用override声明此方法的重写。

  2. 隐藏:基类方法不做声明(默认为非虚方法),在派生类中使用new声明此方法的隐藏(new可写可不写)。

2、重写和隐藏的区别

  1. 重写(virtaul)时,定义的变量为基类或派生类, 赋值为派生类时,皆调用基类的重写方法(会从派生类中查找有重写则调用 ,没则调用基类方法)。
  2. 隐藏(new)时,定义的变量为基类,则调用基类的方法(不管赋值是派生类还是基类),定义的变量为派生类则调用派生类的方法。

猜你喜欢

转载自blog.csdn.net/qq_44034384/article/details/106652112