从技术上讲,接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。
定义接口的一般形式为:
[attributes] [modifiers] interface identifier [:base-list] {interface-body}[;]
|
说明:
· attributes(可选):附加的定义性信息。
· modifiers(可选):允许使用的修饰符有new和四个访问修饰符。分别是:new、public、protected、internal、private。在一个接口定义中同一修饰符不允许出现多次,new修饰符只能出现在嵌套接口中,表示覆盖了继承而来的同名成员。The public, protected, internal, and private修饰符定义了对接口的访问权限。
· 指示器和事件。
· identifier:接口名称。
· base-list(可选):包含一个或多个显式基接口的列表,接口间由逗号分隔。
· interface-body:对接口成员的定义。
· 接口可以是命名空间或类的成员,并且可以包含下列成员的签名: 方法、属性、索引器 。
· 一个接口可从一个或多个基接口继承。
接口这个概念在C#和Java中非常相似。接口的关键词是interface,一个接口可以扩展一个或者多个其他接口。按照惯例,接口的名字以大写字母"I"开头。下面的代码是C#接口的一个例子,它与Java中的接口完全一样:
interface IShape {
void Draw ( ) ;
}
|
如果你从两个或者两个以上的接口派生,父接口的名字列表用逗号分隔,如下面的代码所示:
interface INewInterface: IParent1, IParent2 { }
|
然而,与Java不同,C#中的接口不能包含域(Field)。另外还要注意,在C#中,接口内的所有方法默认都是公用方法。在Java中,方法定义可以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修饰符是非法的。例如,下面的C#接口将产生一个编译错误。
interface IShape { public void Draw( ) ; }
|
下面的例子定义了一个名为IControl 的接口,接口中包含一个成员方法Paint:
interface IControl {
void Paint( ) ;
}
|
在下例中,接口 IInterface从两个基接口 IBase1 和 IBase2 继承:
interface IInterface: IBase1, IBase2 {
void Method1( ) ;
void Method2( ) ;
}
|
接口可由类实现。实现的接口的标识符出现在类的基列表中。例如:
class Class1: Iface1, Iface2 {
// class 成员。
}
|
类的基列表同时包含基类和接口时,列表中首先出现的是基类。例如:
class ClassA: BaseClass, Iface1, Iface2 {
// class成员。
}
|
以下的代码段定义接口IFace,它只有一个方法:
interface IFace {
void ShowMyFace( ) ;
}
|
不能从这个定义实例化一个对象,但可以从它派生一个类。因此,该类必须实现ShowMyFace抽象方法:
class CFace:IFace
{
public void ShowMyFace( ) {
Console.WriteLine(" implementation " ) ;
}
}
|
基接口
一个接口可以从零或多个接口继承,那些被称为这个接口的显式基接口。当一个接口有比零多的显式基接口时,那么在接口的定义中的形式为,接口标识符后面跟着由一个冒号":"和一个用逗号","分开的基接口标识符列表。
接口基:
接口类型列表说明:
· 一个接口的显式基接口必须至少同接口本身一样可访问。例如,在一个公共接口的基接口中指定一个私有或内部的接口是错误的。
· 一个接口直接或间接地从它自己继承是错误的。
· 接口的基接口都是显式基接口,并且是它们的基接口。换句话说,基接口的集合完全由显式基接口和它们的显式基接口等等组成。在下面的例子中
interface IControl {
void Paint( ) ;
}
interface ITextBox: IControl {
void SetText(string text) ;
}
interface IListBox: IControl {
void SetItems(string[] items) ;
}
interface IComboBox: ITextBox, IListBox { }
|
IComboBox 的基接口是IControl, ITextBox, 和 IlistBox。
· 一个接口继承它的基接口的所有成员。换句话说,上面的接口IComboBox就像Paint一样继承成员SetText 和 SetItems。
· 一个实现了接口的类或结构也隐含地实现了所有接口的基接口。
接口主体
一个接口的接口主体定义接口的成员。
interface-body:
{ interface-member-declarationsopt }
|
定义接口成员
接口可以包含一个和多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数或析构函数,而且不能包含任何静态成员。接口定义创建新的定义空间,并且接口定义直接包含的接口成员定义将新成员引入该定义空间。
说明:
· 接口的成员是从基接口继承的成员和由接口本身定义的成员。
· 接口定义可以定义零个或多个成员。接口的成员必须是方法、属性、事件或索引器。接口不能包含常数、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。
· 定义一个接口,该接口对于每种可能种类的成员都包含一个:方法、属性、事件和索引器。
· 接口成员默认访问方式是public。接口成员定义不能包含任何修饰符,比如成员定义前不能加abstract,public,protected,internal,private,virtual,override 或static 修饰符。
· 接口的成员之间不能相互同名。继承而来的成员不用再定义,但接口可以定义与继承而来的成员同名的成员,这时我们说接口成员覆盖了继承而来的成员,这不会导致错误,但编译器会给出一个警告。关闭警告提示的方式是在成员定义前加上一个new关键字。但如果没有覆盖父接口中的成员,使用new关键字会导致编译器发出警告。
· 方法的名称必须与同一接口中定义的所有属性和事件的名称不同。此外,方法的签名必须与同一接口中定义的所有其他方法的签名不同。
· 属性或事件的名称必须与同一接口中定义的所有其他成员的名称不同。
· 一个索引器的签名必须区别于在同一接口中定义的其他所有索引器的签名。
· 接口方法声明中的属性(attributes), 返回类型(return-type), 标识符(identifier)和形式参数列表(formal-parameter-lis)与一个类的方法声明中的那些有相同的意义。一个接口方法声明不允许指定一个方法主体,而声明通常用一个分号结束。
· 接口属性声明的访问符与类属性声明的访问符相对应,除了访问符主体通常必须用分号。因此,无论属性是读写、只读或只写,访问符都完全确定。
· 接口索引声明中的属性(attributes),类型(type)和形式参数列表(formal-parameter-list)与类的索引声明的那些有相同的意义。
下面例子中接口IMyTest包含了索引指示器、事件E、方法F、属性P这些成员:
interface IMyTest{
string this[int index] { get; set; }
event EventHandler E ;
void F(int value) ;
string P { get; set; }
}
public delegate void EventHandler(object sender, EventArgs e) ;
|
下面例子中接口IStringList包含每个可能类型成员的接口:一个方法,一个属性,一个事件和一个索引。
public delegate void StringListEvent(IStringList sender);
public interface IStringList
{
void Add(string s);
int Count { get; }
event StringListEvent Changed;
string this[int index] { get; set; }
}
|
接口成员的全权名
使用接口成员也可采用全权名(fully qualified name)。接口的全权名称是这样构成的。接口名加小圆点"." 再跟成员名比如对于下面两个接口:
interface IControl {
void Paint( ) ;
}
interface ITextBox: IControl {
void GetText(string text) ;
}
|
其中Paint 的全权名是IControl.Paint,GetText的全权名是ITextBox. GetText。当然,全权名中的成员名称必须是在接口中已经定义过的,比如使用ITextBox.Paint.就是不合理的。
如果接口是名字空间的成员,全权名还必须包含名字空间的名称。
namespace System
{
public interface IDataTable {
object Clone( ) ;
}
}
|
那么Clone方法的全权名是System. IDataTable.Clone。
from:http://blog.csdn.net/netzhou/archive/2007/07/06/1680641.aspx
分享到:
相关推荐
本教程将深入探讨C#中的接口编程,分为七个主要部分: **第一节 接口概述** 接口提供了多继承的能力,这是C#中类无法做到的。通过接口,一个类可以实现多个接口,从而表现出多种行为。接口在设计上强调了抽象和解耦...
【C#网络编程方法概述】 在C#网络编程中,理解TCP/IP协议栈的结构及其基本概念至关重要。TCP/IP协议栈是互联网通信的基础,它包含了从底层硬件到高层应用程序的一系列协议,使得不同设备间能有效地进行数据交换。...
而System.Net.Sockets命名空间则提供了低级别的网络编程接口,包括对TCP、UDP等传输协议的支持。开发者可以使用这两个名字空间中的类和方法创建基于流套接字(如TCP)和数据报套接字(如UDP)的应用程序。 在C#网络...
### C#网络编程概述 C#网络编程是.NET框架中的一个重要组成部分,它允许开发者创建能够与互联网或其他网络资源交互的应用程序。MSDN(Microsoft Developer Network)提供的PDF资料和视频教程,是学习这一主题的宝贵...
### C#网络编程之C#套接字编程详解 #### 一、概述 在.NET环境中进行网络编程的主要方式依然是基于套接字编程。本章节主要介绍C#中的套接字编程,包括同步通信与异步通信的开发过程,以及如何使用`TcpListener`和`...
- GDI+概述:图形设备接口加(GDI+)是.NET Framework的一部分,用于创建图形和文本。 - 绘图基础:掌握使用Graphics类进行绘图的基本方法,如绘制线条、形状、路径、图像等。 - 文字渲染:学习如何使用Font和...
语言集成查询(LINQ)是C#中用于数据访问的强大工具,文档中不仅介绍了LINQ的概述、基础和在C#中的应用,还提供了使用LINQ进行数据查询和转换的详细示例。文档还涉及了异步编程模型、异步返回类型、取消任务等异步...
**C#串口编程基础入门实例** 在C#编程中,串口通信是连接硬件设备、进行数据交换的重要手段。本实例将引导你逐步了解如何使用C#进行串口编程,实现向端口发送数据的基本功能。串口编程通常涉及COM端口,这些端口在...
套接字(Socket)是操作系统提供给应用程序进行网络通信的编程接口。在C#中,套接字编程通常涉及***.Sockets命名空间,包括TCP和UDP两种类型的套接字。 多线程编程是C#中的一个重要方面,允许程序同时执行多个线程...
### C#接口基础教程知识点详解 #### 接口概述 - **定义**:接口(Interface)是一种编程概念,用于定义程序间的约定。它为类或结构体提供了必须遵循的规范,确保实现接口的对象具备相同的特性。 - **实现**:任何...
### R语言与C#混合编程技术详解 #### 一、基础知识概述 在现代软件开发领域,混合编程技术已经成为一种常见的实践方法,它允许开发者结合多种编程语言的优势来构建高效的应用程序。本文将深入探讨如何利用R语言和...
"C# GDI+编程教程" 本教程主要讲解了使用C#进行图形图像编程的基础知识,包括GDI+绘图基础、C#图像处理基础和简单的图像处理技术。 GDI+绘图基础 ------------- GDI+是微软在Windows 2000以后操作系统中提供的新...
C#编程概述介绍 C#(读作"C sharp")是一种由微软开发并标准化的面向对象的编程语言,主要用于构建Windows应用程序、Web应用以及移动应用等。它在.NET框架或.NET Core平台上运行,提供了一种高效、类型安全的编程...
C#编程概述: C#(读作"C sharp")是一种由微软公司开发的面向对象的编程语言,主要用于构建Windows应用程序、Web应用以及移动应用。它以其简洁、类型安全和性能高效而著称,是.NET框架的主要开发语言。C#的设计受到...
在C#编程实战宝典中,我们探讨了C#这一强大而灵活的编程语言的核心概念、实战技巧以及如何利用它来构建高效的应用程序。C#是Microsoft开发的一种面向对象的编程语言,它广泛应用于Windows桌面应用、游戏开发、Web...