在实际的编程中会有很多类、方法、函数等出现同名的情况,造成了程序的可读性差的问题。为了避免这种问题的出现,C#提供了很多机制来区别或修改同名的函数或方法,如:命名空间、类名、重载和覆盖等。这篇博客将会对重载和覆盖进行比较,并通过例子来强化记忆。
一、重载
1、重载示意
重载(Overload)是重新加载的意思,指的是同一个类中同名,但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字。通俗点说重载是对内存中同一个类中的函数或方法进行重新加载的意思。
2、发生条件
必须发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关。
如:
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修饰。
如:
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关键字。
如:
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)两个函数的函数名一定相同,但函数特征可相同也可不相同,应用在子类和父类中,会隐藏父类同名函数。
它们三者的在使用时还有很多需要注意的地方,在应用中慢慢积累吧,如果有不懂或不对的地方请留言互相交流哦。
分享到:
相关推荐
c#没有现成的multipart/form-data库,自己封的一个demo供参考。
批量序列生成工具V 1.0 (C#源代码)-------- by wgscd 209/8/9
//------------------------------------------------------------------------------// //名称:昆虫来袭BugCome //功能:小游戏 //适用:.net 4.0 && win7 //编程:VS2010 C# //时间:2012/10/12 //--------------...
自己用C#做的RS232通讯程序...看看吧...里面纠正了网上很多看似可以的程序段...这也是自己实验过的... ----------------2020/06/08 18:16 更新分割线--------------- 已经有十年了 居然还有人需要 那就开始免费吧 ...
这是一款asp.net(c#)+sql数据库开发的计算机毕业设计作品,只能用于作业设计
使用c#实现的HttpClient拼接multipart/form-data形式参数post提交数据,包含图片内容,有需要的可以下载,希望能帮到有需要的人,
此压缩包中,包含了ge公司pmc-5565光纤反射内存卡在C#/C++环境下编程所需要的所有二次开发文件,包含.h .lib .dll
重写:是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override。重载:用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。多态:c#的多态性...
C# AES加密采用ECB/PKCS7方式
c#模拟post发送json和multipart/form-data格式
graphql-net-client, .NET/C#的非常简单的GraphQL客户端 graphql-net-client.NET/C#.的非常简单的GraphQL客户端需要 JSON.NET!类型的结果class GqlObj{ public string name { get; set; }
采用ASP应用技术开发,简单易懂,WindowsXP运行环境
用C#调用VISA,实现GPIB/LAN/USB等通讯。VS2019亲测
新手学习web的资源,web服务器开发-c#/asp/html/iss安装过程、java、JavaScript
C#知识库 1.0 2003-4-17 C#知识库 2.0 2003-7-25 C#知识库 3.0 2004-2-26 C#知识库 4.0 2004-06-13 C#知识库 5.0 2005-06-27 增加了UML C#知识库 5.1 2005-07-25 增加了企业设计模式 C#知识库 6.0 2007-01-05 增加了...
C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框
C#求1-1/2+1/3-1/4+…….-1/100的值
因项目需要合入vlc播放器,由于工程是64位的,而在网上找的大部分是32位的vlc库和demo无法兼容。现在终于找到一个32/64位的库demo,自己再重新整理了一下分享出来。
《C#案例:限制TextBox只能输入字母》,就如题目的意思一样,让文本框只能输入字母,否则会显示提示框。 采用的是通过正则表达式实现的: 匹配特定字符串: ^[A-Za-z]+$ //匹配由26个英文字母组成的字符串 ^[A...
用C#写的简单的TCP/IP通信小示例,开发环境为VS2013,里面有一个服务端和一个客户端,适合新手看看