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表达式同样适用于事件

posted @ 2010-09-28 15:09  绿茶叶  阅读(691)  评论(0编辑  收藏  举报