new,virtual,override,interface,delegate,event-------------C#——方法实现总结

简介:

C#——方法实现总结

本文分两部分来写,第一部分:C#方法实现的理解与问题,第二部分:C#中方法实现的种类。

第一部分:C#方法实现的理解与问题

理解:

1. 使用virtual和override关键字,在基类和派生类中用同样的方法签名实现不同的方法

2.  使用interface接口,在不同的类中,用相同的方法签名实现不同的方法

3.  用委托delegate,把不同类中的方法集合在一起,然后一起调用,完成某种综合的功能

4.  使用事件,完成跟委托一样的功能

以上四条全都说明了面向对象的多态性。

问题

怎么样区分委托和事件?

我把它们给混淆了,分不清楚。

第二部分:C#中方法的实现分为以下几种:

1.最基本的方法声明

returnType  methodName (parameterList)

{

//方法主体

}

2.声明new方法

假如基类和派生类中声明了两个具有相同签名的方法,那么在编译的时候会出现一条警告信息(派生类的方法会屏蔽基类中的方法)

如果在派生类中使用new关键字来声明与基类有着相同签名的方法,编译时不会出现警告信息,派生类的方法依然会屏蔽基类中的方法,只是编译时不出现警告信息

Example:

Class Horse:Mammal

{

New public void Talk()

{

//方法主体

}

}

3.声明virtual方法

声明virtual方法的目的:提供同一个方法的不同实现,而这些方法是相互关联的,因为他们旨在完成相同的任务,只是不同的类(不同的类只能时派生类)会有不同的实现。

用virtual关键字把方法声明为virtual

Example:

namespace System

{

Class Object

{

Public virtual string ToString()

{

//方法主

}

4.声明override方法

假如基类将一个方法声明为virtual方法,派生类就可以用override关键字来声明该方法的另一个实现。

Example:

Class Horse:Mammal

{

Public override string ToString()

{

}

}

在派生类中一个方法的新的实现可以调用方法在基类中的原始实现,这要用base关键字来实现。

Example:

Public override string ToString()

{

base.ToString();

}

注意:

使用virtual和override关键字声明多态方法遵守的规则如下:

A.不允许用virtual和override声明一个private方法,否则出现编译错误

B.两个方法的的签名必须完全一致,返回类型也必须相同。也就是说他们必须有相同的名称,相同的参数类型,相同的参数数量,以及相同的返回类型。

C.两个方法必须有相同的可访问性。例如其中一个方法是public,那么另一个必须是public的(方法也可以是protect)

D.只能是override重写virtual方法,如果基类方法不是virtual,你试图用override重写它,会出现编译错误

E.假如派生类不用override来声明方法,就不会重写基类方法,它会成为和基类方法完全不相关的另一个方法的实现,该方法只是恰巧与基类方法同名,这样会造成编译时发出警告:该方法会隐藏继承的同名方法。可以用new关键字消除这一警告。

F.一个override的方法会隐式的成为virtual方法,本身可在未来的派生类中被override,不允许用virtual显式的声明override方法

5.扩展方法

扩展方法是在一个静态类中定义的,要扩展的类型必须是方法的第一个参数,而且必须附加一个this关键字。

扩展方法允许通过附加的静态方法来扩展现有的类型(无论类还是结构),任何语句一旦引用被扩展类型的数据,就能立即使用这些静态方法。

Example:

Static class Util

{

Public static int Negate(this int i)

{

return –i;

}

}

要使用扩展方法,只需要让Util类进入作用域(如有必要,添加using语句,指定Util类所在的命名空间),然后可以简单的使用“.”记号法来引用方法。

Example:

Int x=591;

Console.writeline(“x.Negate{0}”,Util.Negate(x));

6.Interface 接口

接口名字以大写字母I开头,同样的方法名字,在不同的类(这个不同的类不是指的派生类)中有不同的实现方法。

接口只包含方法的名称、返回类型和参数,方法具体的实现接口并不关心。

(我的理解:接口只是声明方法,不实现方法)

接口中不允许指定任何访问修饰符(不能限制public 、private、protected)

Example:

Interface IComparable

{

Int compareTo(object obj)

}

要实现一个接口,需要声明一个类或结构,让他们从接口继承,并实现接口指定的所有方法。

注意:

实现一个接口必须保证:每个方法都完全匹配与它对应的接口中的方法

A方法名和返回类型完全匹配

B所有参数完全匹配(包括ref和out关键字修饰符)

C使用接口名作为方法名的前缀,这称为显式接口实现,我们平时应多使用显式接口实现

D用于实现一个接口的所有方法都必须具有public可访问性,假如使用显式接口实现,则不应该为方法添加访问修饰符

7.委托(delegate)

委托是指向一个方法的指针,通过指定一个委托名称,就可以通过委托来调用不同类中的方法。

委托用法:

A 委托在类中声明,

B 创建委托实例,

C 在类的构造器中为委托实例添加其他类的方法

D 在类中编写方法调用委托实例

注意:

在命名空间声明的委托不需要在构造其中添加方法,不需要在类中写方法调用委托,可以直接调用委托

使用委托的时候,遇到带参数的方法,有两种处理方法:

 A:创造方法适配器实现委托

 B:利用lambda表达式实现委托

8.事件

   事件是在委托的基础上进行声明的。

   具体做法:

A:首先在类中声明委托;

B:利用声明的委托声明事件

C:订阅事件(为事件添加方法)

D:引发事件(跟委托相似,把一个事件当方法调用)

注意:

事件只能由定义它的类来引发,在类外部引发事件会造成编译错误

lambda表达式同样适用于事件

作者:绿茶叶 
出处:http://www.cnblogs.com/greenteaone/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/greenteaone/archive/2010/09/28/1837585.html

目录
相关文章
|
运维 监控 Java
nacos常见问题之获取配置文件的时候报错user not found如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
2713 2
|
Prometheus Cloud Native
Prometheus的告警处理
【10月更文挑战第31天】Prometheus的告警处理
270 3
ly~
|
安全 生物认证 数据库
有哪些常见的身份验证错误和漏洞?
本文介绍了常见的网络安全问题,包括弱密码、密码重用、身份验证流程缺陷、会话管理问题和社会工程学攻击。具体涉及简单密码易被破解、多平台使用同一密码、缺乏多因素认证、身份验证绕过、会话劫持与固定、钓鱼攻击和伪装攻击等。这些问题可能导致用户信息泄露和系统安全风险。
ly~
1415 5
|
存储 JSON 测试技术
GAIA: 一个严苛的智能体基准 简要概括
目前有 乱糟糟的一堆 规划策略,所以我们选择了一个相对简单的预先计划工作流程。每隔 N 步,我们生成两件事情: • 我们已知或可以从上下文中推导出的事实摘要和需要发现的事实 • 基于新观察和上述事实摘要,逐步制定解决任务的计划 可以调整参数 N 以在目标用例中获得更好的性能: 我们为管理智能体选择了 N=2,为网页搜索智能体选择了 N=5。 一个有趣的发现是,如果我们不提供计划的先前版本作为输入,得分会提高。直观的解释是,LLM 通常对上下文中任何相关信息有强烈的偏向。如果提示中存在先前版本的计划,LLM 可能会大量重复使用它,而不是在需要时重新评估方法并重新生成计划。 然后,将事实摘要和计划
480 1
|
机器学习/深度学习 监控 固态存储
探索深度学习在视频分析中的应用
【6月更文挑战第7天】本文探讨了深度学习在视频分析的应用,涉及目标检测、行为识别、场景理解和视频生成。深度学习借助CNN、3D卷积、RNN/LSTM捕捉时空信息。目标检测有R-CNN和YOLO等方法,行为识别包括时空特征和骨骼数据方法。场景理解涵盖语义分割、目标跟踪和场景分类,视频生成则利用GAN和RNN生成连续帧。尽管面临数据标注、计算资源和泛化能力挑战,深度学习在视频分析领域前景广阔。
|
机器学习/深度学习 并行计算 PyTorch
ONNX 优化技巧:加速模型推理
【8月更文第27天】ONNX (Open Neural Network Exchange) 是一个开放格式,用于表示机器学习模型,使模型能够在多种框架之间进行转换。ONNX Runtime (ORT) 是一个高效的推理引擎,旨在加速模型的部署。本文将介绍如何使用 ONNX Runtime 和相关工具来优化模型的推理速度和资源消耗。
6662 4
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
271 116