欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表

接口,虚方法和抽象方法(二)

创建时间:2012年12月14日 22:20  阅读次数:(3469)
分享到:
C#语言支持两种实现接口方法的技术:一种接口方法的实现技术是将其作为带有相同名字和签名的公有方法,另一种是实现相同签名的私有方法,但方法名字必须遵循interfaceName.methodName的约定。例如,对于接口名为IDrawable的Display方法,其实现的方法名为IDrawable.Display。

这两种技术主要的不同在于:对于前者,方法变成了类的公有签名的一部分,对于后者;其方法只能通过一个向上类型转换(up-cast)转换为对应的接口类型。因而,当你必须重载一个给定的方法名,而它又是基于调用该方法的引用范畴时,后一种技术就是必不可少的,对于类的约定来说,当你想要一个类型更为安全的方法版本时,可能需要这么做。例如,考虑下面的类,它实现了
System.ICloneable:
Using System;
Public class Patient:IColneable{
//这是该类公有约定的一部分
Public Patient Clone(){
Return (Patient)this.MemberwiseClone();
}
//只是私有的,只能通过ICloneable访问
Object ICloneable.Clone(){
Return this.MemberwiseClone();
}
}

注意,Patient类型的公有约定包含一个强类型Clone方法,它返回精确的引用类型。这样使用patient类型执行克隆,对调用方就更方便,原因就是第二个对象引用已经转换到了预期的类型。相比之下,尽管对于使用ICloneable引用来访问对象的调用方,仍然可以得到正确的行为,但那些客户端在使用ICloneable.Clone方法返回的结果之前,可能需要做个向下类型转换(down-cast)。

使用限定方法名实现接口抽象成员的另一个优点是:它可以让你很容易地处理跨接口的命名冲突。当一个类实现两个或多个接口,而这些接口又带有同样的方法声明,但语义却不同时,这种冲突就会发生。尽管这种情形很少见,但实际上也是可能的。考虑下面这个典型的例子:
Public interface ICowboy{
Void Draw();
}
Public interface IArtist{
Void Draw();
}
Public class AcePowell:ICowboy,IArtist{
Void ICowbay.Draw(){Shoot();}
Void IArtist.Draw(){Paint();}
Public void Draw(){Attract();}
}

注意,AcePowell类有三个Draw方法。CLR将根据用于调用方法的引用类别确定选择哪一个。

到目前为止所展示的每个例子,其接口方法的实现都隐式地为final,如同存在sealed和override修饰符一样。如表6.3所不,当一个接口方法的实现被标记为public时,它还能被标记为virtual和absttract,使方法成为可替换的。这将允许派生类型能够重写这个方法。这种重写将替换基类型方法基于类和基于接口的用法。对于一个派生类型,只是通过重新声
明支持接口,就可能替换基类型的接口实现方法的部分和全部。如果这么做,派生类型就可以随意地提供任何接口方法的新实现,而不用考虑基类型是如何声明它们的。

示例6.5显示了一个c#程序,其中,基类型Base使用刚才描述的技术,实现了三个接口方法。注意,派生类型Derivedl只能替换基类型的Turn方法。这是因为基类型并没有把其他任何方法声明为virtual。相比之下,Derived2类可以替换所有接口方法。这是因为Derived显式地重新声明了对于IVehicle接口的支持。在这个例子中,程序决不会在Derived2实例上调用基类型Start的实现。这是因为Start方法能被调用的惟一方式是通过IVehicle接口,Derived2类已经为它显式地提供了一个Start方法。程序可以在Derived2的实例上调用基类型的Stop方法和Turn方法。

接口方法声明形式
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 26+11=? 的结果(结果是:37)
结  果: