C#方法重载(overload)、重写(覆盖)(override)、隐藏(new)

重载

同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。而返回值类型不同是不能构成重载的。

作用:  重载必须发生在一个类中,函数名相同,参数类型或者个数可以不同,返回值类型可以不同。根据参数选择调用方法。重载就是让类以统一的方式处理不同的数据,在同一个类中多个方法可以用同一个名字就叫做方法重载。

 

 

 

重写override

作用:用于实现接口、抽象类、虚方法

重写override一般用于接口实现和继承类的方法改写,要注意:

  1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

 

  2、从 C# 9.0 开始,override 方法支持协变返回类型。 具体而言,override 方法的返回类型可从相应基方法的返回类型派生。 在 C# 8.0 和更早版本中,override 方法和重写基方法的返回类型必须相同。

    3、不能重写非虚方法或静态方法。 重写基方法必须是 virtualabstractoverride

  4、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

 

  5、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

重写object 类型的ToString()

 

  6、可以说,override是一个非常智能的东西,它可以动态决定究竟是采用父类还是子类的方法。

 

   public override string ToString()
    {
        return base.ToString(); 
    }

 

 

 

隐藏(new)

隐藏简单地说就是基类中已经定义的方法,派生类中也需要用,而两个方法完全相同的话就会出现语法错误,所以用关键字new把基类中的方法隐藏了,但是该方法想用的时候还可以发挥作用,又不会发生语法冲突。

 

using System;  
using System.Text;  
  
namespace OverrideAndNew  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            BaseClass bc = new BaseClass();  
            DerivedClass dc = new DerivedClass();  
            BaseClass bcdc = new DerivedClass();  
  
            // The following two calls do what you would expect. They call  
            // the methods that are defined in BaseClass.  
            bc.Method1();  
            bc.Method2();  
            // Output:  
            // Base - Method1  
            // Base - Method2  
  
            // The following two calls do what you would expect. They call  
            // the methods that are defined in DerivedClass.  
            dc.Method1();  
            dc.Method2();  
            // Output:  
            // Derived - Method1  
            // Derived - Method2  
  
            // The following two calls produce different results, depending
            // on whether override (Method1) or new (Method2) is used.  
            bcdc.Method1();  
            bcdc.Method2();  
            // Output:  
            // Derived - Method1  
            // Base - Method2  
        }  
    }  
  
    class BaseClass  
    {  
        public virtual void Method1()  
        {  
            Console.WriteLine("Base - Method1");  
        }  
  
        public virtual void Method2()  
        {  
            Console.WriteLine("Base - Method2");  
        }  
    }  
  
    class DerivedClass : BaseClass  
    {  
        public override void Method1()  
        {  
            Console.WriteLine("Derived - Method1");  
        }  
  
        public new void Method2()  
        {  
            Console.WriteLine("Derived - Method2");  
        }  
    }  
}

 

posted @ 2022-01-28 14:58  小林野夫  阅读(1531)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/