第十三章、创建接口和定义抽象类
接口不包含任何代码或数据:它只规定了从接口继承的类必须提供哪些方法和属性。使用接口,方法的名称/签名可以和方法的具体实现完全隔绝。
抽象类在许多方面都和接口相似,只是它们可以包含代码和数据。然而,可以将抽象类的某些方法指定为虚方法,指示从抽象类继承的类必须以自己的方式实现这些方法。
理解接口
接口指定“有什么”,也就是方法的名称、返回类型和参数。至于具体“如何做”。或者说方法具体如何实现,则不是接口所关心的。接口描述了类提供的功能,但不描述功能如何实现。
定义接口
定义接口类似于定义类,只是要用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
第十三章、创建接口和定义抽象类相关推荐
- visual C#(十三)创建接口和定义抽象类
参考书:< visual C# 从入门到精通> 第二部分 理解C#对象模型 第13章 创建接口和定义抽象类 文章目录 13.1 理解接口 13.1.11 定义接口 13.1.2 实现接口 ...
- CLR via C#学习笔记-第十三章-定义接口、继承接口
13.1 类和接口继承 接口是为了实现多继承 所有的类都继承了System.Object,及其四个公共实例方法:ToString.Equals.GetHashCode.GetType. CLR允许定义 ...
- Java声明定义抽象类_接口_继承_实现
文章目录 声明定义抽象类 声明定义接口 派生类.抽象类.接口的继承要点 声明定义抽象类 public abstract class CRMSystem {public abstract Client ...
- 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 ...
- 第十三章 手动创建 REST 服务(一)
文章目录 第十三章 手动创建 REST 服务(一) 手动创建 `REST` 服务的基础知识 创建 `URL` 映射 带有 `` 元素的 `URLMap` 指定参数 为单个 `URL`指定多个路由 路由 ...
- Java继承与多态(抽象类和接口练习)定义抽象类Bank,它包含oneyearRate(一年定期利率)oneyearNationalbebt(一年国债利率)和CurrentDepositRate(按年
定义抽象类Bank,它包含oneyearRate(一年定期利率)oneyearNationalbebt(一年国债利率)和CurrentDepositRate(按年计算的活期利率)三个利息率常数(分别为 ...
- 设计一个接口, 并设计一个实现类实现该接口,演示它们的使用。具体,创建一个名称为Person的接口,在接口中定义两个方法sayHello()和sayBye()。
设计一个接口, 并设计一个实现类实现该接口,演示它们的使用. 具体,创建一个名称为Person的接口,在接口中定义两个方法sayHello()和sayBye().然后,创建两个实现了Person接口的 ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- 第十三章 数据库支持
第十三章 数据库支持 本章讨论Python数据库API(一种连接到SQL数据库的标准化方式),并演示如何使用这个API来执行一些基本的SQL.最后,本章将讨论其他一些数据库技术. 关Python支持的 ...
最新文章
- 安装Scrapy时:Microsoft Visual C++ 9.0 is required
- 近20万奖金:天池异常检测大赛来了!
- 一行代码搞定 FTP 服务
- mysql 查询优化 ~ 多表查询基础知识
- Nginx进程间通讯方式
- simpy练习案例(二):不直接控制流程,而是使用事件隐形控制流程 env.event()
- 防盗链IHttpHandler
- 学习AJAX,解析XMLHttpRequest对象
- 5v 3.3v电平转换电路_MOS管电平转换电路,硬件工程师居家旅行、看门护院的必备良药...
- SqlServer两表之间:根据一个表的字段更新另一个表的字段
- java json 反序列化_java-如何将json字符串反序列化为对象
- QT的QWebEngineView内存泄漏
- android中的imagebutton,Android:以编程方式在ImageButton中设置图像的填充
- java se官网_Java下载|Java SE Development Kit官方下载-太平洋下载中心
- 麦克风阵列技术 一 (名词解释 背景介绍 麦克风及音频信号 麦克风阵列简介)
- android高德地图获取省市编码,android中高德地图地理编码
- 批处理、分时、实时、网络、分布式操作系统的区别
- 龙芯2F入手,点滴记录!
- 树莓派I2C通过Shell操作FDC2214
- 2009年中国直销业9大主旋律
热门文章
- Linux 光盘的挂载和解挂
- 如果你要实现IOC,请简单描述一下实现步骤?
- Spring的使用步骤
- 由于更换了java版本,Eclipse启动时报错:JRE or JDK must be available in order to run Eclipse
- 【已解答】Linux ./configure --prefix 命令是什么意思?
- 8086数据寄存器介绍
- 输入一个链表,反转链表后,输出新链表的表头。
- linux可以打开浏览器嘛,Linux下怎样可以打开浏览器
- 求最大素数的c语言,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
- am.java_6.3.1 从am说起