1.公有方法实现C#接口方法
尽管C#在定义接口时不用指明接口方法的访问控制方式,但默认接口方法均为public型(这可以从反编译的IL代码中看到)。下面是使用Reflector查看的接口IL代码:
class private interface abstract auto ansi IControl{
method public hidebysig newslot abstract virtual instance void Paint() cil managed{
}
}
- 1.
- 2.
- 3.
- 4.
实现接口的类需要实现所有接口方法。通常情况下,接口的实现方法也为public型。如下案例:
using System ;
interface IControl
{
void Paint();
}
public class EditBox: IControl
{
public void Paint()
{
Console.WriteLine("Pain method is called!");
}
}
class Test
{
static void Main()
{
EditBox editbox = new EditBox();
editbox.Paint();
((IControl)editbox)。Paint();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
接口就好像是关系型数据库中的一对多表,一个接口对应多个接口方法,每个接口方法又对应虚拟方法表(VMT)中的某个公有或私有方法。可见通过接口对方法进行调用需要多出一道转换工作,因此执行效率不如直接调用。
2.私有方法不能实现C#接口方法
如果想将接口方法直接实现为私有方法是办不到的。下面的EditBox的代码中Paint方法没有特殊说明,默认为private,导致代码无法执行:
using System ;
interface IControl
{
void Paint();
}
public class EditBox: IControl
{
void Paint()
{
Console.WriteLine("Pain method is called!");
}
public void ShowPaint()
{
this.Paint();
((IControl)this)。Paint();
}
}
class Test
{
static void Main()
{
EditBox editbox = new EditBox();
editbox.ShowPaint();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
程序在编译时将显示如下编译错误:“”EditBox“不会实现接口成员”IControl.Paint()“。”EditBox.Paint()“或者是静态、非公共的,或者有错误的返回类型。”
由于接口规范中的方法默认的访问权限是public,而类中的默认访问权限是default,也就是说private,因此导致权限范围收缩,两者权限并不相同,所以必须将类的权限调整为public才可以使上面的代码得以执行。
3.实现专门的C#接口方法
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();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
【编辑推荐】