浅谈C#接口方法

开发 后端
这里介绍C#接口方法,尽管C#在定义接口时不用指明接口方法的访问控制方式,但默认接口方法均为public型。

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.

【编辑推荐】

  1. 介绍Mono C#编译器
  2. C#运算符重载学习总结
  3. 概述C#语言的结构体
  4. C#遗传算法学习笔记
  5. 讨论C#分部方法
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-25 16:16:43

C# oledbcon

2009-09-02 14:18:08

C#声明COM接口

2009-08-10 10:04:25

C#抽象类C#接口

2009-02-05 15:32:23

接口委托

2009-08-28 12:25:58

C#静态方法

2011-09-21 10:56:31

C#结构

2009-08-20 18:30:33

C# ReaderWr

2011-04-08 09:52:44

C++C#DLL

2009-08-21 10:28:21

C#异步方法C#同步方法

2009-09-07 03:23:40

C# Main方法

2009-08-24 11:02:52

C#接口映射

2009-08-24 09:55:26

C#接口转换

2009-08-26 13:15:38

C#选择控制

2009-08-26 15:46:01

C#匿名类型

2009-08-06 15:30:23

C#类型系统

2009-09-02 15:41:21

C# HTTPWebR

2009-08-20 10:24:52

C#开发WinForm

2009-08-31 09:37:09

C# Employee

2009-08-19 17:12:18

C# Connecti

2009-08-12 11:24:25

C# String对象
点赞
收藏

51CTO技术栈公众号