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

值得注意的是,方法重载只有通过参数不同来判断调用哪个方法,而不能通过返回值。至于原因,可以这样理解,你调用一个方法,如果有多个方法同名,系统必须要知道到底你要调用哪一个,参数可以帮助系统在方法入口处得到答案,他根据你给的参数就知道该使用哪个方法。如果只有返回值的不同,很多情况系统是不可能得到有效的判断条件的,比如:double method();int method();如果你这样调用:method()。系统当然不知道该调用哪个。

示例:

//返回值相同,参数不同

class BillPayment
{
void PayBill(int TelephoneNumber)
{
//此方法用于支付固定电话费
}
void PayBill(long CustomerNumber)
{
//此方法用于支付电费
}
void PayBill(long CustomerNumber,double amount)
{
//次方法用于支付移动电话费
}
}
}

//返回值相同,参数个数不同

class Add
{
int addtion(int num1,int num2)
{
return num1+num2;
}
int addtion(int num1,int num2,int num3)
{
returnnum1+num2+num3;
}
}

//参数不同,返回值不同

int Method(int[] numbers)
{
}
double Method(double[] numbers)
{
}

注:泛型出现后,相同参数,相同返回值的方法也能构成重载,这里不介绍。

二、重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的,即方法名,参数,返回值都相同。

例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.

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

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

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

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

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

示例:

namespace 方法重写
{
class Program
{

static voidMain(string[] args)
{
BaseClass CO =new ClassOverride();
CO.SetName("Override");
}
//基类
public classBaseClass
{
public virtualvoid SetName(string name)
{
Console.WriteLine("基类:我的名字是" + name);
}
}

//派生类
public classClassOverride : BaseClass
{
publicoverride void SetName(string name)
{
Console.WriteLine("Override:我的名字是" + name);
}
}

}
}

在方法重写中,我们介绍了虚方法,那么虚方法和抽象方法有什么区别呢?

1.虚方法有一个实现部分可以被子类继承,从而使子类获得和基类相同的方法,另外也为派生类提供了覆盖该方法的选项。相反,抽象方法没有提供实现部分,是一种强制派生类覆盖的方法(否则派生类不能成具体类)

2.(abstract)抽象方法只能在抽象类中声明,(virtual)虚方法不是。

3.(abstract)抽象方法必须在派生类中重写而(virtual)虚方法不必。

4.(abstract)抽象方法不能声明方法实体,虚方法可以。

个人感觉,方法重载和方法重写都有点像多态,同一个方法的多种形态:执行“相同”的方法,却通过它们自己的实现代码来实现,即同一种方法,不同的对象会产生不同的结果。

三、隐藏(方法):基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。隐藏时,访问父类则调用父类的方法,访问子类则调用子类的方法。

示例:

namespace 隐藏
{
class Program
{

static voidMain(string[] args)
{
ClassNew CN =new ClassNew();
CN.SetName("new");

BaseClass BC =CN;
BC.SetName("基类");
}
//基类
public classBaseClass
{
public voidSetName(string name)
{
Console.WriteLine("基类:我的名字是" + name);
}
}
//派生类
public classClassNew : BaseClass
{
//这里如果不使用new,将生成警告!
new publicvoid SetName(string name)
{
Console.WriteLine("new:我的名字是" + name);
}
}
}
}

运行结果:new:我的名字是new

基类:我的名字是基类

如果上述扔不好理解,我们再举一个隐藏静态变量的例子

namespace 隐藏继承成员
{
class Program
{
public classBaseClass
{
public static int A = 123;
}

public classClassNew : BaseClass
{
new public static int A = 456;

static voidMain(string[] args)
{
Console.WriteLine(A);
}

}
}
}

运行结果:456

注:不仅有方法隐藏,还有其他的,通过继承隐藏名称一般采用下列形式之一:

1.引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。

2.引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。

3.引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。

4.在同一成员上同时使用 new 和 override 是错误的。

另外,在不隐藏继承成员的声明中使用 new 修饰符将生成警告。在隐藏继承成员的生命中不使用new修饰符也将产生警告
---------------------
作者:shan9liang
来源:CSDN
原文:https://blog.csdn.net/shan9liang/article/details/6777764
版权声明:本文为博主原创文章,转载请附上博文链接!

C#方法重载(overload)方法重写(override)隐藏(new)的更多相关文章

  1. 【转】重载(overload),覆盖(override),隐藏(hide)的区别

    原文网址:http://www.cppblog.com/zgysx/archive/2007/03/12/19662.html 写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖 ...

  2. 重载(overload),覆盖(override),隐藏(hide)的区别

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...

  3. 抽象方法(abstract method) 和 虚方法 (virtual method), 重载(overload) 和 重写(override)的区别于联系

    1. 抽象方法 (abstract method) 在抽象类中,可以存在没有实现的方法,只是该方法必须声明为abstract抽象方法. 在继承此抽象类的类中,通过给方法加上override关键字来实现 ...

  4. Java方法多态性——方法的重载Overload和重写Override

    方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式. 重写(Override) 重写是 ...

  5. 【Java】重载(Overload)与重写(Override)

    方法的语法 修饰符 返回值类型 方法名(参数类型 参数名){ ... 方法体 ... return 返回值; } 重载(overload) /** * 重载Overload: * 同一个类中,多个方法 ...

  6. Java面试 - 重载(Overload)和重写(Override)的区别?

    1.重载是在同一个类中,可声明多个同名方法,但参数列表不同(参数顺序,个数,类型).而重写是在子类中,对从父类中继承的方法进行重新编写,但方法名,参数列表(参数顺序,个数,类型),返回值类型必须保持一 ...

  7. 重载overload 、重写override

    观点:重载和重写完全没有关系要联系到一起,唯一的联系就是他们都带有个'重'字,所以鄙人也随大流把他们放在了一起 注意:下面可复制的代码是正确的,错误的只会上传图片,不上传可复制的代码 重载 1.在同一 ...

  8. 重载(overload)、覆盖(override)和隐藏(hide)

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...

  9. C++ 重载(overload)、重写(overrride)、重定义(redefine)总结

    引自:http://www.189works.com/article-42111-1.html 先来看几个概念: 重载(overload),重写(override,也称覆盖), 重定义(redefin ...

  10. 方法的覆盖(override)、重载(overload)和重写(overwrite)

    body { background-color: white } .markdown-body { min-width: 200px; max-width: 760px; margin: 0 auto ...

随机推荐

  1. Elasticsearch从入门到精通-Elasticsearch是什么

    作者其他ELK快速入门系列文章 logstash快速入门实战指南 Kibana从入门到精通 一.前言 驱动未来商业发展的最重要“能源”不是石油,而是数据.我们还来不及了解它,这个世界已经被它淹没.多年 ...

  2. SQL语句方法语法总结(一)

    1.distinct:返回不重复.唯一的值. select distinct col_name from tbl_name --表中的col_name 列的值 如果有10条一样的,仅返回一条. 2.w ...

  3. OpenResty api网关设计

    本文讲述 OpenResty api网关设计,主要涉及api网关介绍.openresty api网关 请求路由(路由判断.路由重写.服务判断.限流).授权验证(统一认证).动态Upstream 以及这 ...

  4. 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对

    string result = "aaa?a=1&b=2&c=3&d=4"; string[] array = result.Split('?'); //s ...

  5. [转]认识JWT

    本文转自:https://www.cnblogs.com/cjsblog/p/9277677.html 1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准 ...

  6. git获取远程服务器的指定分支

    昨天糗大了...进入新公司,公司服务器上有Online为线上版本,开发版本默认的为Master,本地clone的开发版为master,公司用的git 自动部署(puh后服务器自动更新了代码...这个有 ...

  7. 1.Linux电源管理-休眠与唤醒

    1.休眠方式 在内核中,休眠方式有很多种,可以通过下面命令查看 # cat /sys/power/state //来得到内核支持哪几种休眠方式. 常用的休眠方式有freeze,standby, mem ...

  8. Java高并发--缓存

    Java高并发--缓存 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在下图中每一个部分都可以使用缓存的技术. 缓存的特征 缓存命中:直接通过缓存获取到数据 命中率: ...

  9. Netty实战十之编解码器框架

    编码和解码,或者数据从一种特定协议的格式到另一种格式的转换.这些任务将由通常称为编解码器的组件来处理.Netty提供了多种组件,简化了为了支持广泛的协议而创建自定义的编解码器的过程.例如,如果你正在构 ...

  10. 史上最全python面试题详解 (二)(附带详细答案(关注、持续更新))

    23.re的match和search区别? re.match()从开头开始匹配string. re.search()从anywhere 来匹配string. # 多行模式>>> re ...