函数重载有哪些主要优点,一定要重载吗
解决方案 »
- 请问bengouxiong,C#怎么输出1+1
- 如何实现类似WINRAR,在选中多个文件后用右键启动程序,并将这些路径传递给启动的程序,如何实现?
- 怎样利用 mshtml.IHTMLElementCollection 点击链接
- 调用webService,获取DataSet,报"无法创建目录或文件"
- 页面服务器连接另一台数据库服务器报错百分在线等方案
- 俺关于窗体程序重新登陆的问题
- winform中用select语句访问Access数据库时是否可以用sum,group by等聚合函数
- 如何实现动态菜单?
- C#控制台应用程序如何清屏
- c#下mysql怎么才能像sqlite一样使用
- 急求C#解答
- 有关委托与事件的问题
如
str(0)="A";
str(1)="B";
str(2)="C";一个方法为ToString()
返回值为"A,B,C",即缺省以逗号做间隔一个重载方法为ToString(String splitString)
可以由用户指定间隔符比如调用ToString(" ")则输出"A B C"如果不使用重载你就得起两个函数名了。楼主设计一些类就能理解重载的必要性了,几乎是必然使用的。
函数的重载是静态的多态
而函数的重写Virtual/Override则是一种动态的多态
Add方法
public string Add(params string[] str);
public int Add(int a, int b);
public int Add(ref int a, int b);
public double Add(double a, double b);
这样在调用的时候我们都是Call的Add方法,但是却根据参数的不同而产生不同的行为。
对于开发者来说,也不用去记那么多不同的方法名,一个方法名,不同参数,实现不同即可。
既然楼上的大哥说到了早绑定,晚绑定,那么我也来凑一脚,说说自己的理解:
上代码:
Scenairo 1: class Parent
{
public void Call()
{
Console.WriteLine("Call of Parent");
}
} class Child:Parent
{
public void Call()
{
Console.WriteLine("Call of Child");
}
} class test
{
public static void Main()
{
Parent child = new Child();
a.Call();
Console.ReadKey(); }
}输出Call of Parent,这里child中的Call方法会有一个警告,要加new,加上之后输出结果一样Scenario 2:class Parent
{
public virtual void Call()
{
Console.WriteLine("Call of Parent");
}
} class Child:Parent
{
public void Call()
{
Console.WriteLine("Call of Child");
}
} class test
{
public static void Main()
{
Parent child = new Child();
child.Call();
Console.ReadKey(); }
}虽然Parent中的Call方法改成了虚方法,但是输出结果
仍然是Call of Parent,child中的Call方法还是会有一个警告,要加new,加上之后输出结果一样。Scenario 3 class Parent
{
public virtual void Call()
{
Console.WriteLine("Call of Parent");
}
} class Child:Parent
{
public override void Call()
{
Console.WriteLine("Call of Child");
}
} class test
{
public static void Main()
{
Parent child = new Child();
child.Call();
Console.ReadKey(); }
}父类方法中Virtual,子类方法中Override
输出Call of Child
上述的三种情况: 1和2都是早绑定,而3则是晚绑定
因为在实例话子类的时候,其引用都是父类,那么C#会判断,如果调用的方法在父类和子类中有了
Virtual/Override对的话,那么才会在运行时判断,实例到底是什么,此处3情况,实例是子类的,所以去调用了子类Call的方法
而对于1,2情况来说,应为没有Virtual/Override对,即使是虚方法,编译器也不会管你,它在编译的时候只会去看引用的类型,此处,因为实例化时的引用类型是父类型,所以方法指针直接指向父类方法,这个就叫做早绑定