C# 重载(overload)

一、重载的含义

重载允许在同一作用域内定义多个同名函数,但这些函数必须在参数类型、个数或顺序上存在区别,以便编译器可以根据传递给函数的参数来确定调用哪个函数。在C#中,函数的重载是通过函数签名(函数名称和参数类型、数目以及顺序)来确定的,并不包括返回类型。可以定义相同函数名的函数,只要它们的参数有所不同即可。如果有多个函数符合调用条件,则编译器会选择最匹配的函数。

二、重载的特点

1.名称相同,参数列表不同。

public void GetInfo()
        {
            Console.WriteLine("我是第1个重载方法!");
        }

        public void GetInfo(int Num)
        {
            Console.WriteLine($"我是第2个重载方法!");
        }

2.参数个数不同,参数类型不同。

public void GetInfo(string Name)
        {
            Console.WriteLine("我是第1个重载方法!");
        }

        public void GetInfo(string Name,int Num)
        {
            Console.WriteLine($"我是第2个重载方法!");
        }

3.参数个数相同,参数类型的顺序不同。

public void GetInfo(int Num,string Name)
        {
            Console.WriteLine("我是第1个重载方法!");
        }

        public void GetInfo(string Name,int Num)
        {
            Console.WriteLine($"我是第2个重载方法!");
        }

三、方法重载的好处

1.减少类的对外接口(只显示一个方法),降低类的复杂度。

2.便于用户使用(相同功能的方法名称一样)和识别。

3.提高程序的可读性和复用性。

四、方法重载的无关性

1.方法重载与返回值无关。

2.实例方法和静态方法都可以进行方法重载。

五、接口不能重载

接口的定义:一般情况下,接口只能包含方法、属性、索引器和事件的声明。不能实例化接口,它只能包含其成员的签名,接口也不能有构造函数。

接口定义也不允许包含运算符重载,这不是因为声明它们在原则上有问题,而是接口的公共定义,如果接口包含运算符重载会引起一些与其他.NET语言不兼容的问题。

六、重载的分类

1.方法重载

在同一个类中,方法名称相同,但是参数列表不同(参数个数不同、参数类型不同、不同类型的排列顺序不同),称之为方法的重载,方法的重载不包含继承关系,重载不用考虑方法的返回值类型,重载类型顺序必须不同。

class Program
    {
        static void Main(string[] args)
        {
            ClassOverload CO = new ClassOverload();
            CO.GetInfo();
            CO.GetInfo(2);
            CO.GetInfo("我是第3个重载方法", 2);
            CO.GetInfo(2, "我是第4个重载方法");
        }
    }
    class ClassOverload
    {
        public void GetInfo()
        {
            Console.WriteLine("我是第1个重载方法!");
        }
        public void GetInfo(int Num)
        {
            Console.WriteLine($"我是第{Num}个重载方法!");
        }
        public void GetInfo(string Name, int Num)
        {
            Console.WriteLine($"{Name}我有{Num}个参数");
        }
        public void GetInfo(int Num, string Name)
        {
            Console.WriteLine($"{Name}我有{Num}个参数,我的参数顺序与第3个方法不同");
        }
    }

运行结果如下:

2.构造函数重载

指一个类中构造函数也可以重载,只要符合重载的规则即可,重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。
两个重载函数必须在下列一个或两个方面有所区别:
1、函数的参数个数不同。
2、函数的参数类型不同或者参数类型顺序不同。

class Program
    {
        static void Main(string[] args)
        {
            ClassOverload CO1 = new ClassOverload();
            ClassOverload CO2 = new ClassOverload(2);
            ClassOverload CO3 = new ClassOverload("我是第3个重载函数方法", 2);
            ClassOverload CO4 = new ClassOverload(2, "我是第4个重载函数方法");
        }
    }
    class ClassOverload
    {
        public ClassOverload()
        {
            Console.WriteLine("我是第1个重载函数方法!");
        }
        public ClassOverload(int Num)
        {
            Console.WriteLine($"我是第{Num}个重载函数方法!");
        }
        public ClassOverload(string Name, int Num)
        {
            Console.WriteLine($"{Name}我有{Num}个参数");
        }
        public ClassOverload(int Num, string Name)
        {
            Console.WriteLine($"{Name}我有{Num}个参数,我的参数顺序与第3个方法不同");
        }
    }

运行结果如下:

3.泛型方法的重载

泛型方法可以重载,为特定的类型定义规范。这也适用于带泛型参数的方法。

GetInfo()方法定义了两种,第一种接受一个泛型参数,第二种是专门用于int参数的;

它在编译期间, 会使用最佳匹配。

class Program
    {
        static void Main(string[] args)
        {
            ClassOverload CO = new ClassOverload();
            CO.GetInfo("我是第1个重载方法!");
            CO.GetInfo(2);
        }
    }
    class ClassOverload
    {
        public void GetInfo<T>(T obj)
        {
            Console.WriteLine($"{obj.ToString()}");
        }
        public void GetInfo(int Num)
        {
            Console.WriteLine($"我是第{Num}个重载方法!");
        }
    }

运行结果如下:

4.运算符重载

重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表,由于涉及到新的关键字,本重载将会在下文详细解释,敬请期待!!!

七、重载的注意事项

1.在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(同一方法内的几个参数类型必须不一样,例如可以是GetInfo(int, float), 但是不能为GetInfo(int, int)。

2.不能通过访问权限、返回类型进行重新加载。

3.方法的数目不会对重新加载造成影响。

4.对于继承来说,如果某一方法在父类中是访问权限是private,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值