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方法。