一、重载的含义
重载允许在同一作用域内定义多个同名函数,但这些函数必须在参数类型、个数或顺序上存在区别,以便编译器可以根据传递给函数的参数来确定调用哪个函数。在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,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。