C#的接口基础教程之二 定义接口

定义接口

从技术上讲,接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。

定义接口的一般形式为:

[attributes] [modifiers] interface identifier [:base-list] {interface-body}[;]

说明:

1、attributes(可选):附加的定义性信息。

2、modifiers(可选): 允许使用的修饰符有 new 和四个访问修饰符。分别是:new、public、protected、internal、 private。在一个接口定义中同一修饰符不允许出现多次,new 修饰符只能出现在嵌套接口中,表示覆盖了继承而来的同名成员。The public, protected, internal, and private 修饰符定义了对接口的访问权限。

3、指示器和事件。

4、identifier:接口名称。

5、base-list(可选):包含一个或多个显式基接口的列表,接口间由逗号分隔。

6、interface-body:对接口成员的定义。

7、接口可以是命名空间或类的成员,并且可以包含下列成员的签名: 方法、属性、索引器 。

8、一个接口可从一个或多个基接口继承。

接口这个概念在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 " ) ;
 } 
}

基接口

一个接口可以从零或多个接口继承,那些被称为这个接口的显式基接口。当一个接口有比零多的显式基接口时,那么在接口的定义中的形式为,接口标识符后面跟着由一个冒号":"和一个用逗号","分开的基接口标识符列表。

接口基:

:接口类型列表说明:

1、一个接口的显式基接口必须至少同接口本身一样可访问。例如,在一个公共接口的基接口中指定一个私有或内部的接口是错误的。

2、一个接口直接或间接地从它自己继承是错误的。

3、接口的基接口都是显式基接口,并且是它们的基接口。换句话说,基接口的集合完全由显式基接口和它们的显式基接口等等组成。在下面的例子中
 
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。

4、一个接口继承它的基接口的所有成员。换句话说,上面的接口 IComboBox 就像Paint一样继承成员SetText 和 SetItems。

5、一个实现了接口的类或结构也隐含地实现了所有接口的基接口。

接口主体

一个接口的接口主体定义接口的成员。
 
interface-body:
{ interface-member-declarationsopt }

定义接口主要是定义接口成员,请看下一节--定义接口成员。

时间: 2024-10-06 00:48:46

C#的接口基础教程之二 定义接口的相关文章

C#的接口基础教程之七 覆盖虚接口

有时候我们需要表达一种抽象的东西,它是一些东西的概括,但我们又不能真正的看到它成为一个实体在我们眼前出现,为此面向对象的编程语言便有了抽象类的概念.C#作为一个面向对象的语言,必然也会引入抽象类这一概念.接口和抽象类使您可以创建组件交互的定义.通过接口,可以指定组件必须实现的方法,但不实际指定如何实现方法.抽象类使您可以创建行为的定义,同时提供用于继承类的一些公共实现.对于在组件中实现多态行为,接口和抽象类都是很有用的工具. 一个抽象类必须为类的基本类列表中列出的接口的所有成员提供实现程序.但是

Java Web基础教程(二)开发基础

Java Web基础教程(二)开发基础 转载:Future魏来 前言 Java web是一种基于B\S(浏览器\服务器)架构的网络应用程序的技术实现.这种结构的Web应用程序被大量的企业级应用所采用.随着Web应用程序的规模不断扩大,传统的Web开发模式无法满足日渐复杂的业务需要,所以出现了更加合理更加先进的MVC开发模式.随之而来的也出现了一系列的基于MVC模式的开发框架,Struts框架.Spring MVC 等. 1. Web 技术的发展 1. 第一阶段 静态网站 Web技术出现伊始,由于

jQuery基础---Ajax基础教程(二)

jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处! 在 Ajax 基础一篇中,我们了解了最基本的异步处理方式.本篇来了解一下 Ajax 的一些全局请求事件.跨域处理和其他一些问题. 一.加载请求 在 Ajax 异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的问题.而超过一定时间的请求, 用户就会变得不再耐烦而关闭页面. 而如果在请求期间能给用户一些提示,比如:“正在

C#的接口基础教程之三 定义接口成员

接口可以包含一个和多个成员,这些成员可以是方法.属性.索引指示器和事件,但不能是常量.域.操作符.构造函数或析构函数,而且不能包含任何静态成员.接口定义创建新的定义空间,并且接口定义直 接包含的接口成员定义将新成员引入该定义空间. 说明: 1.接口的成员是从基接口继承的成员和由接口本身定义的成员. 2.接口定义可以定义零个或多个成员.接口的成员必须是方法.属性.事件或索引器.接口不能包含常数.字段.运算符.实例构造函数.析构函数或类型,也不能包含任何种类的静态成员. 3.定义一个接口,该接口对于

C#的接口基础教程之五 实现接口

1.显式实现接口成员 为了实现接口,类可以定义显式接口成员执行体(Explicit interface member implementations).显式接口成员执行体可以是一个方法.一个属性.一个事件或者是一个索引指示器的定义,定义与该成员对应的全权名应保持一致. using System ;interface ICloneable { object Clone( ) ;}interface IComparable { int CompareTo(object other) ;}class

C#的接口基础教程之四 访问接口

对接口成员的访问 对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的.如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员.但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义: using System ;interface ISequence { int Count { get; set; }}interface IRing { void Count(in

C#的接口基础教程之六 接口转换

C#中不仅支持.Net 平台,而且支持COM平台.为了支持 COM和.Net,C# 包含一种称为属性的独特语言特性.一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息.属性使 C# 能够支持特定的技术,如 COM 和 .Net,而不会干扰语言规范本身.C# 提供将COM接口转换为 C#接口的属性类.另一些属性类将 COM类转换为C# 类.执行这些转换不需要任何 IDL 或类工厂. 现在部署的任何COM 组件都可以在接口转换中使用.通常情况下,所需的调整是完全自动进行的. 特别是,可以

jquery 基础教程[温故而知新二]

子曰:“温故而知新,可以为师矣.”孔子说:“温习旧知识从而得知新的理解与体会,凭借这一点就可以成为老师了.“ 尤其是咱们搞程序的人,不管是不是全栈工程师,都是集十八般武艺于一身.不过有时候有些知识如果有很久没用了的话,就会忘记,甚至是忘的你一点都想不起来,尤其是一些基础的东西.所以我才打算写个"温故而知新"的系列博文出来,一来是这些基础的东西我比较健忘,以后方便自己翻阅:二来是希望可以帮助到一些刚入门的朋友.这个系列记录的所有知识点都是最最最(重要的事情说三遍)基础的知识.大部分都是我

[原]OpenGL基础教程(二)多边形绘制

上篇介绍了最基本的三角形绘制,本篇介绍如何使用索引的方式绘制多边行. 为什么要使用索引方式,总体来说提高性能.如何提高:使用顶点数组的好处是避免大量的函数调用.即避免每画一个顶点就调用1次glVertex*(). 另一个好处是避免多边形相邻顶点的冗余指定.例如正方体,分别描述6个正方形,会造成每个顶点被重复描述3次. 如果以上没有说服力,看看这个, gl.Begin(),gl.End()对是一种低效的方式,因此opengl es干脆不再支持他们了,同时高版本的opengl都在弃用gl.Begin