C#学习(四)之接口

第四周章老师详细讲了C#有关接口,数组以及字符串方面的知识,由于后两者知识点太过零碎,不太容易记录,所以本次学习记录就只讨论一下接口。

接口,使用interface关键字进行声明,功能是把所需成员组合起来,以封装一定功能的集合。它好比一个模板,在其中定义了对象必须实现的成员,通过类或结构来实现它。

需要牢牢记住的是:接口不能直接实例化,接口不能包含成员的任何代码,只定义成员本身。接口成员的具体代码由实现接口的类提供。

接口的声明格式如下列代码所示:

1 [attributes] [access-modifiers] interface interface-name [:base-inteface-list]
2 {
3        interface body
4 }

各项释义

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

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

interface-name :接口名, 习惯上以大写 I 开头。

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

interface body :接口主体(不能有访问修饰符),只是定义接口的方法和属性等的签名,实际的实现是写在使用该接口的class里。

实际接口声明代码示例如下:

1 public interface IStorable
2 {
3     void Read( );//注意这里一定不能有public之类的修饰符
4     void Write(object);//并且只是签名,不能有实际内容
5 }

接口的继承使用示例如下:

1 public class Document : IStorable//如继承一般类一般继承接口
2 {
3     public void Read( ) {...}//这里可以加修饰符了,并写出实现代码
4     public void Write(object obj) {...}
5     // ...
6 }

一个类是可以继承多个接口的,代码示例如下:

 1 interface ICompressible//定义新接口
 2 {
 3     void Compress();
 4     void Decompress();
 5 }
 6 public class Document : IStorable, ICompressible
 7 {
 8     //实现IStorable
 9     public void Read( ) {...}
10     public void Write(object obj) {...}
11     // 实现ICompressible
12     public void Compress(){ …}
13     public void Decompress() { …}
14 }

另外,接口也是可以继承接口的,代码示例如下:

 1 interface ILoggedCompressible
 2 : ICompressible
 3 {
 4     void LogSavedBytes();
 5 }
 6
 7 public class Document : ILoggedCompressible
 8 {
 9     // 实现ICompressible
10     public void Compress(){ …}
11     public void Decompress() { …}
12     // 实现ILoggedCompressible
13     public void LogSavedBytes() { …}
14 }

接口继承接口不用实现继承的接口中的方法,不过一个类继承一个有继承其他接口的接口时,一定要实现继承链上所有接口中的所有方法,不然就会报错。

同时,接口也是可以同时继承多个接口的,代码示例如下:

1 interface IStorableCompressible
2      : IStorable, ILoggedCompressible//同时继承两个接口
3 {
4     void LogOriginalSize();  //增加的新方法
5 }
时间: 2025-01-15 18:47:18

C#学习(四)之接口的相关文章

Dubbo 项目学习(四) 接口抽取以及依赖版本统一

引言 前面的系列项目中,我们会发现有个接口是一样的,我们需要单独抽取出来,统一维护,这样可以更加高效的处理项目.同时,两个项目的maven依赖包也可以统一维护,这样有助于项目在多人协作的同时,保证项目依赖的统一性. 系列文档目录 Dubbo 项目学习(一) Admin 管理控制台 Dubbo 项目学习(二) 发布Dubbo服务 Dubbo 项目学习(三) 消费Dubbo服务 Dubbo 项目学习(四) 接口抽取及以来版本统一 创建父工程 我们新建一个dubbo-parent项目,作为父级工程,用

SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合

之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBatis框架的学习(六)——MyBatis整合Spring.本文我再来讲SpringMVC和MyBatis整合开发的方法,这样的话,Spring.MyBatis和SpringMVC三大框架的整合开发我们就学会了.这里我使用的Spring是Spring4.1.3这个版本(SpringMVC自然也是这个版本),MyBatis是MyBatis3.2.7这个版本. 为了更好的学习SpringMVC和MyBatis整合开发的方法

Android Camera fw学习(四)-recording流程分析

Android Camera fw学习(四)-recording流程分析 备注:备注:本文是Android5.1学习笔记.博文按照软件启动流程分析.  且行且惜,一步一个脚印,这次学习camera Video.虽然标题是recording流程分析,但这里很多和preview是相似的(包含更新,创建Stream,创建Request),这里主要分析MediaRecorder对象创建.video帧监听对象注册.帧可用事件以及一系列callback流程分析. 一.认识video(mediaRecorde

nodejs学习四 Node.js NPM

什么是NPM? 不知道大家注意没有,windows平台下的Node.js安装包大小才区区4M多,真可以用短小精悍来形容它,作为一种编程语言,像java一个SDK 就几十M,为什么node.js的运行环境这么小呢?这其中的微妙之处在于,它拥有一个庞大的第三方软件库. 在Node本身提供的包(原生)中没有我们要实现的功能模块的时候,我们可以去寻找下是否已经有人实现了这种功能.毕竟重复造轮子这种事情,很多人都不想干. 去哪里寻找我们想要的包呢?如果你还不知道报的名字,你可以去https://www.n

ZigBee学习四 无线+UART通信

ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique message ID (counter) afAddrType_t GenericApp_DstAddr; //unsigned char uartbuf[128];/********************************************************************** L

Spark学习四:网站日志分析案例

Spark学习四:网站日志分析案例 标签(空格分隔): Spark Spark学习四网站日志分析案例 一创建maven工程 二创建模板 三日志分析案例 一,创建maven工程 1,执行maven命令创建工程 mvn archetype:generate -DarchetypeGroupId=org.scala-tools.archetypes -DarchetypeArtifactId=scala-archetype-simple -DremoteRepositories=http://scal

Beaglebone Back学习四(GPIO实验)

GPIO Beaglebone Back开发板引出了92个引脚,其中只有65个GPIO口可通过配置使用,由于引脚具有"复用"的特性,大约每个引脚有8种工作模式(Beagle System Reference Manual),默认情况下,设为Mode7.由于P8扩展部分的引脚功能相对简单,复用不多,故项目功能复杂时,最好选择P8上的GPIO口. 对GPIO口的操作,主要有三个步骤 1 选择GPIO口根据以下两表,确定使用那个GPIO口,该表也可以在BBB_SRM文件中找到. (1)拉电流

Silverlight学习(四) domainservice动态多条件查询

上次讲了silverlight+MVVN+EF的简单框架,能够实现简单的数据CURD,但是多条件动态的查询一直没有实现.在网上查阅了很多资料,发现自己走了很多误区,代码很难调试正确. 这次的查询是基于上次的查询,只是增加了一个查询条件,动态多条件的查询的重点是获取查询的语言. 1 private string GetSql() 2 { 3 string query = "1=1"; 4 if (!string.IsNullOrEmpty(searchText.name)) 5 { 6

Gradle学习(四) web工程构建

Gradle为应用开发提供了两个相关的插件:war plugin以及jetty plugin war plugin继承了java plugin为你的工程构建war包,jetty pugin继承了war plugin可以让的工程构建在嵌入式容器jetty中 构建War文件 首先在你的build.gradle中添加如下一行 apply plugin: 'war' 由于war plugin继承了java plugin,所有java plugin也会被默认的加入配置文件中 运行gradle build命

TweenMax动画库学习(四)

目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            TweenMax动画库学习(四)            TweenMax动画库学习(五)