接口不包含任何代码或数据:它只规定了从接口继承的类必须提供哪些方法和属性。使用接口,方法的名称/签名可以和方法的具体实现完全隔绝。

  抽象类在许多方面都和接口相似,只是它们可以包含代码和数据。然而,可以将抽象类的某些方法指定为虚方法,指示从抽象类继承的类必须以自己的方式实现这些方法。

  理解接口

  接口指定“有什么”,也就是方法的名称、返回类型和参数。至于具体“如何做”。或者说方法具体如何实现,则不是接口所关心的。接口描述了类提供的功能,但不描述功能如何实现。

  定义接口

  定义接口类似于定义类,只是要用interface关键字而不是class关键字。在接口中,要按照与类或结构中一样的方式声明方法,只是不允许指定任何访问类型。另外,接口中的方法是没有实现的,它们只是声明。实现接口的所有类型都必须提供自己的实现。所有,方法主体被替换成一个分号。如:

  interface IComparable{

  int CompareTo(Object obj);

  }

  Microsoft.NET Framework 文档建议接口名以大写字母I开头。

  接口不包含任何数据:不可以向接口添加字段(私有的也不行)。

  实现接口

  为了实现接口,需要声明类或结构从接口继承,并实现接口指定的全部方法。虽然不能从一个结构派生出另一个结构,但结构是可以实现接口的(从接口“继承”)。

  interface ILandBound

  {

  int NumberLegs();

  }

  calss Horse: ILandBound

  {

  ..........

  public int NumberLegs()   //隐式实现接口

  {

  return 4;

  }

  }

  实现接口时,必须保证每个方法都完全匹配对应的接口方法,具体遵循以下几个规则:

  ①方法名和返回类型完全匹配

  ②所有参数(包括ref和out关键字修饰符)都完全匹配

  ③用于实现接口的所有方法都必须具有public可访问性。但是,如果使用显示接口实现,则不应该为方法添加访问修饰符。

  一个类可以在扩展另一个类的同时实现接口。C#用一种位置记号来加以区分。首先写基类名,再写逗号,最后写接口名。如

  interface ILandBound

  {

  ............

  }

  class Mammal

  {

  .................

  }

  class Horse:Mammal, ILandBound

  {

  .................

  }

  一个接口可以从另一个接口继承,这在技术上称为接口扩展。

  使用多个接口

  一个类最多只能有一个基类,但可以实现不限数量的接口。

  class Horse:Mammal, ILandBound,IGrazable

  {

  .....................

  }

  显示实现接口

  interface ILandBound

  {

  int NumberOfLegs(); //几条腿

  }

  interface IJourney

  {

  int NumberOfLegs();//跑了几站

  }

  class Horse : ILandBound, IJourney

  {

  .......

  int ILandBound. NumberOfLegs()

  {

  return 4;

  }

  int IJourney. NumberOfLegs()

  {

  return 3;

  }

  }

  如果方法是显示接口实现的一部分,就不能为方法指定访问修饰符。

  访问显示实现接口的方法,通过接口引用对象:

  Horse horse = new Horse();

  .......

  IJourney journeyHorse = horse;

  int legInJourney = journeyHorse .NumberOfLegs();

  ILandBound landBoundHorse = horse;

  int legInHorse = landBoundHorse .NumberOfLegs();

  接口的限制

  ①不允许在接口中定义任何字段,包括静态字段。

  ②不允许在接口中定义任何构造器。

  ③不允许在接口中定义任何析构器。析构器包含由于析构(销毁)对象实例的语句。

  ④不允许为任何方法指定访问修饰符

  ⑤不允许在接口中嵌套任何类型(如枚举、结构、类或接口)。

  ⑥虽然一个接口能从另一个接口继承,但不允许从结构或者类中继承一个接口。

  抽象类

  为了明确声明不允许创建某个类的实例,必须将那个类显式声明为抽象类(不能封装,不允许实例化对象),这是用abstract关键字完成的。如:定义一个草食性哺乳动物抽象类

  abstract class GrazingMammal: Mammal,IGrazable

  {

  ........................

  }

  试图实例化一个GrazingMammal对象,代码将无法通过编译。

  抽象方法

  抽象类可以包含抽象方法。抽象方法原则上与虚方法相似,只是它不包含方法主体。派生类必须重写(override)这种方法。抽象方法适合在以下情形下使用:一个方法在抽象类中提供默认实现没有意义,但又需要继承类提供该方法的实现。

abstract abstract   class GrazingMammal: Mammal,IGrazable

  {

  abstract void DigestGrass();  //抽象方法

  ........................

  }

  密封类

  如果不想一个类作为基类使用,可以使用C#提供的sealed(密封)关键字防止类被用作基类。例如:

  sealed class Horse: GrazingMammal,ILandBound

  {

  ..................

  }

  在密封类中不能声明任何虚方法,另外抽象类不能密封。

  结构隐式密封。永远不能从一个结构派生。

  密封方法

  可用sealed关键字密封继承到的虚方法,阻止当前类的派生类继续重写该方法。只有重写方法才能密封(用sealed override 来修饰方法)。可像下面这样理解interface、virtual、override和sealed关键字

  interface(接口)引入方法名称。

  virtual(虚)是方法的第一个实现,可由派生类重写。

  override(重写)是派生类重写的实现,是方法的第二个实现。

  sealed(密封)是方法的最后一个实现,再下面的派生类不能重写了。

转载于:https://www.cnblogs.com/linhuide/p/5819875.html

第十三章、创建接口和定义抽象类相关推荐

  1. visual C#(十三)创建接口和定义抽象类

    参考书:< visual C# 从入门到精通> 第二部分 理解C#对象模型 第13章 创建接口和定义抽象类 文章目录 13.1 理解接口 13.1.11 定义接口 13.1.2 实现接口 ...

  2. CLR via C#学习笔记-第十三章-定义接口、继承接口

    13.1 类和接口继承 接口是为了实现多继承 所有的类都继承了System.Object,及其四个公共实例方法:ToString.Equals.GetHashCode.GetType. CLR允许定义 ...

  3. Java声明定义抽象类_接口_继承_实现

    文章目录 声明定义抽象类 声明定义接口 派生类.抽象类.接口的继承要点 声明定义抽象类 public abstract class CRMSystem {public abstract Client ...

  4. Day16-01 P71 面向对象12什么是多态 P72 对象13:instanceof和类型转换 P73 static关键字详解 P74 抽象类 P75 接口的定义与实现 P76N种内部类

    Day16-01 P71 面向对象12:什么是多态 //父类Person package com.oop.demo06;public class Person {public void run(){S ...

  5. 第十三章 手动创建 REST 服务(一)

    文章目录 第十三章 手动创建 REST 服务(一) 手动创建 `REST` 服务的基础知识 创建 `URL` 映射 带有 `` 元素的 `URLMap` 指定参数 为单个 `URL`指定多个路由 路由 ...

  6. Java继承与多态(抽象类和接口练习)定义抽象类Bank,它包含oneyearRate(一年定期利率)oneyearNationalbebt(一年国债利率)和CurrentDepositRate(按年

    定义抽象类Bank,它包含oneyearRate(一年定期利率)oneyearNationalbebt(一年国债利率)和CurrentDepositRate(按年计算的活期利率)三个利息率常数(分别为 ...

  7. 设计一个接口, 并设计一个实现类实现该接口,演示它们的使用。具体,创建一个名称为Person的接口,在接口中定义两个方法sayHello()和sayBye()。

    设计一个接口, 并设计一个实现类实现该接口,演示它们的使用. 具体,创建一个名称为Person的接口,在接口中定义两个方法sayHello()和sayBye().然后,创建两个实现了Person接口的 ...

  8. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  9. 第十三章 数据库支持

    第十三章 数据库支持 本章讨论Python数据库API(一种连接到SQL数据库的标准化方式),并演示如何使用这个API来执行一些基本的SQL.最后,本章将讨论其他一些数据库技术. 关Python支持的 ...

最新文章

  1. 安装Scrapy时:Microsoft Visual C++ 9.0 is required
  2. 近20万奖金:天池异常检测大赛来了!
  3. 一行代码搞定 FTP 服务
  4. mysql 查询优化 ~ 多表查询基础知识
  5. Nginx进程间通讯方式
  6. simpy练习案例(二):不直接控制流程,而是使用事件隐形控制流程 env.event()
  7. 防盗链IHttpHandler
  8. 学习AJAX,解析XMLHttpRequest对象
  9. 5v 3.3v电平转换电路_MOS管电平转换电路,硬件工程师居家旅行、看门护院的必备良药...
  10. SqlServer两表之间:根据一个表的字段更新另一个表的字段
  11. java json 反序列化_java-如何将json字符串反序列化为对象
  12. QT的QWebEngineView内存泄漏
  13. android中的imagebutton,Android:以编程方式在ImageButton中设置图像的填充
  14. java se官网_Java下载|Java SE Development Kit官方下载-太平洋下载中心
  15. 麦克风阵列技术 一 (名词解释 背景介绍 麦克风及音频信号 麦克风阵列简介)
  16. android高德地图获取省市编码,android中高德地图地理编码
  17. 批处理、分时、实时、网络、分布式操作系统的区别
  18. 龙芯2F入手,点滴记录!
  19. 树莓派I2C通过Shell操作FDC2214
  20. 2009年中国直销业9大主旋律

热门文章

  1. Linux 光盘的挂载和解挂
  2. 如果你要实现IOC,请简单描述一下实现步骤?
  3. Spring的使用步骤
  4. 由于更换了java版本,Eclipse启动时报错:JRE or JDK must be available in order to run Eclipse
  5. 【已解答】Linux ./configure --prefix 命令是什么意思?
  6. 8086数据寄存器介绍
  7. 输入一个链表,反转链表后,输出新链表的表头。
  8. linux可以打开浏览器嘛,Linux下怎样可以打开浏览器
  9. 求最大素数的c语言,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  10. am.java_6.3.1 从am说起