C#中重载重写和覆盖的定义与区别

时间:2023-01-17 12:52:43

一、重载

  1、重载示意

   重载(Overload)是重新加载的意思,指的是同一个类中同名,但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字。通俗点说重载是对内存中同一个类中的函数或方法进行重新加载的意思。

  2、发生条件

   必须发生在一个类中,函数名相同,参数类型或者个数不同构成重载,与返回类型无关。

如:

?
1
2
3
4
5
6
7
8
9
10
11
Public class Name
{
  Public string GetName(string username)
  {
    Return username;
  }
Public int GetName(int usercount)
  {
    Return usercount;
  }
}

二、重写

   1、示意

    重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或override标注的,不能重写非虚方法或静态方法。

    Override是在继承的时候,如果你写的函数与要继承的函数函数特征(函数特征包括函数名,参数的类型和个数)相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类(或超类)的函数了,它被覆盖掉了。

   2、发生条件

    必须发生在基类和派生类中,基类函数必须用virtual、abstract 或override修饰,派生类用override修饰。

如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Program
  {
    static void Main(string[] args)
    {
      oc oa=new ob();
      oa.b(1, 2);  //输出结果为fdfdf
    }
    public class oc
    {
      private int a;
     //封装
      public int geta
      {
        get { return a; }
      }
      public int seta
      {
        set { a = value; }
      }
     //函数b
      public virtual int b(int c, int e)
      {
        Console.WriteLine("{0}+{1}={2}", c, e, c + e);
        return c + e;
      }
    }
    //派生类ob,基类oc
    public class ob : oc
    {
    //重写基类中的函数b
      public override int b(int c,int e)
      {
        Console.WriteLine("fdfdf");
        return c;
      
    }
}

三、覆盖

   1、示意

    覆盖指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。

   2、发生条件

   在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字。

如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Program
  {
    static void Main(string[] args)
    {
      oc oa=new ob();
      oa.b(1, 2); //输出结果为1+2=3
    }
    public class oc
    {
      private int a;
    //封装
      public int geta
      {
        get { return a; }
      }
      public int seta
      {
        set { a = value; }
      }
    //函数b
      public int b(int c, int e)
      {
        Console.WriteLine("{0}+{1}={2}", c, e, c + e);
        return c + e;
      }
    }
  //派生类ob,基类oc
    public class ob : oc
    {
     //覆盖,隐藏基类中的函数b
      public new int b(int c,int e)
      {
        Console.WriteLine("fdfdf");
        return c;
      
    }
}

重写(Override)的两个函数的函数特征相同,应用在子类和父类中,会重写父类函数;

重载(Overload)的两个函数的函数名虽然相同,但函数特征不同,应用在同一类中;

覆盖(new)两个函数的函数名一定相同,但函数特征可相同也可不相同,应用在子类和父类中,会隐藏父类同名函数。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://blog.csdn.net/Czhenya/article/details/76092072