C#中的接口
3、实现专门的接口方法(1)
代码如下:
using System ; interface IControl { void Paint(); } public class EditBox: IControl { void Paint() { Console.WriteLine("Pain method is called!"); } void IControl.Paint() { Console.WriteLine("IControl.Pain method is called!"); } public void ShowPaint() { this.Paint(); ((IControl)this).Paint(); } } class Test { static void Main() { EditBox editbox = new EditBox(); editbox.ShowPaint(); //editbox.Paint(); ((IControl)editbox).Paint(); } }
EditBox类拥有一私有Paint方法,但这并不是接口方法的实现(上例已经分析过)。EditBox类中还包含了一“void IControl.Paint()”方法, 是该方法复写了接口的Paint方法,该方法是私有的(通过IL代码可以看出)。
注意:“void IControl.Paint()”前不能加任何的修饰限定符号,诸如public、private等,这在C#的语法中是不允许的。该方法反编译得到的IL代码如下:
.class public auto ansi beforefieldinit EditBox extends object implements IControl { ....... .method private hidebysig newslot virtual final instance void IControl.Paint() cil managed { .override IControl::Paint } }
程序运行时内存中的镜像可简化表示为:
程序执行结果如下:
Pain method is called! IControl.Pain method is called! IControl.Pain method is called!
我们之所以可以通过((IControl)editbox).Paint()
方法访问到代码是因为接口方法Paint是公有的。但是我们不能通过editbox.Paint()
方法访问到代码是因为EditBox的Paint方法是私有的。 在EditBox内部,通过ShowPaint方法可以同时访问私有的Paint方法与接口IControl.Paint
方法。