您的位置:首页 > 编程语言 > C#

从面向对象设计谈c#中接口和委托的区别运用

2011-12-07 22:58 357 查看
我们只讨论接口仅包含方法声明的情况,如果接口包含属性、索引器、事件等,与委托肯定不搭。一个仅包含多个方法声明的接口与多个委托要相互替换,在很多情况下都没有技术问题,只是怎样做更合理的问题。

相对于委托来说,接口可以声明多个方法,而且接口名称可以很好的表示这些方法的相关性;接口在同一时间只能引入一种实现,也就是说类Client中有接口IUser型的成员,UserA和UserB都实现了IUser,那么在Client中只能调用UserA或者UserB的方法,要想同时调用A和B的方法,需要创建两个IUser型成员。

相对于接口来说,委托类型只能“声明”一个方法;一个委托实例可以引入任意多个签名适合的方法,并且这些方法的顺序由委托实例所在类的外部决定,也就是说类A中有委托类型B的实例b(也可以是event),那么在Client1、Client2等多个类中都可以给A的实例a的成员b叠加方法,并且顺序由Client1、Clinet2决定。

从某种意义上可以这样理解:接口给一系列类定义了规范,是面向对象的,但同一时间只能代表其中一个类;委托给一系列方法定义了规范,同一时间可以代表这些方法的任意顺序组合。一个仅包含多个方法的接口,可以拆分成多个委托来代替,这样耦合度更低,但是失去了相关性,面向对象的特性也随之失去。一个类中的多个委托实例也可以改成一个接口来代替,但会失去委托可以叠加任意多方法的灵活性,并且如果多个委托是不相关的,会造成理解困难(接口名称就很难定)。

当接口只包含一个方法,委托只需叠加一个方法时,两者的作用是一样的。即使在这种场景下,我们也要明确,接口是针对类,委托是针对方法或某个地方发生了某件事,这样就自然会合理运用了。比如说FrameWork类库中,很多类实现了ICloneable接口,很多控件有OnClick事件。

另外,业务层需要调用表现层的方法时,往往通过提供事件和表现层交互,多线程时还要用Invoke方式调用这个事件。如果业务层提供一个接口让Form实现,总觉得怪怪的,但是微软MVP模式的一种实现方法就是这样的,在P中定义接口让V(WebForm)实现,除了代码重用度提高外,和通常的WebForm做法还是一样的,和MVC有本质区别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: