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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。