博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
接口和抽象类
阅读量:5221 次
发布时间:2019-06-14

本文共 1151 字,大约阅读时间需要 3 分钟。

抽象类主要用作对象系列的基类,共享某些主要特性,例如,共同的目的和结构。

接口则主要用于类,这些类在基础水平上有所不同,但仍可以完成某些相同的任务。

抽象类和接口都包含可以由派生类继承的成员。接口和抽象类都不

能直接实例化,但可以声明这些类型的变量。如果这样做,就可以使用多态性把继承这两种类型的
对象指定给它们的变量。接着通过这些变量来使用这些类型的成员,但不能直接访问派生对象的其
他成员。

派生类只能继承一个基类,即只能直接继承一个抽象类(但可以用一个继

承链包含多个抽象类)。相反,类可以使用任意多个接口。但这不会产生太大的区别——这两种情况
取得的效果是类似的。只是采用接口的方式略有不同。

抽象类可以拥有抽象成员,它们没有代码体,且必须在派生类中实现,否则派生类本身必须也是抽象的;而非抽象成员,它们拥有代码体,也可以是虚拟的,这样就可以在派生类中重写。

另一方面,接口成员必须都在使用接口的类上实现——它们没有代码体。另外,按照定义,接口成员是公共的,因为它们倾向于在外部使用。

但抽象类的成员可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。

此外,接口不能包含字段、构造函数、析构函数、静态成员或常量。

例如,假定有一个对象系列表示火车,基类Train 包含火车的核心定义,例如车轮的规格和引

擎的类型(可以是蒸汽发动机、柴油发动机等)。但这个类是抽象的,因为并没有“一般的”火车。
为了创建一辆实际的火车,需要给该火车添加特性。为此,派生一些类,例如:PassengerTrain、
FreightTrain 和424DoubleBogey 等,如图下图所示。

也可以用相同的方式来定义汽车对象系列,使用Car 抽象基类,其派生类有Compact、SUV 和

PickUp,Car 和Train 甚至可以派生于一个相同的基类Vehicle,如下图 所示。

现在,层次结构中的一些类共享相同的特性,这是因为它们的目的是相同的,而不是因为它们

派生于相同的基类。例如,PassengerTrain、Compact、SUV 和Pickup 都可以运送乘客,所以它们都
拥有IPassengerCarrier 接口,FreightTrain 和Pickup 可以运送货物,所以它们都拥有IHeavyLoadCarrier
接口,如下图 所示。
在进行更详细的细分前,把对象系统以这种方式进行分解,可以清晰地看到哪种情形适合使用
抽象类,哪种情形适合使用接口。只使用接口或只使用抽象继承,就得不到这个示例的结果。

 

转载于:https://www.cnblogs.com/swtool/p/5516532.html

你可能感兴趣的文章
理解伪元素 :before 和 :after
查看>>
HBase-site.xml 常见重要配置参数
查看>>
Sharepoint 文档库根据文件夹层级展示
查看>>
前端编码规范小记
查看>>
LBP等价模式
查看>>
学习进度_第三周
查看>>
Android开发者必须深入学习的10个应用开源项目
查看>>
三元运算 + lambda表达式
查看>>
VI和VIM
查看>>
[小明学Shader]2.理解Shader和Material的关系
查看>>
(原创)c#学习笔记03--变量和表达式04--表达式03--运算符的优先级
查看>>
(转载)(官方)UE4--图像编程----粒子模块技术指南
查看>>
Java代码在本地运行没有问题。上传到阿里云服务器后。出现了中文乱码解决
查看>>
MACBOOK安装WIN7(单系统)
查看>>
windbg script ---- .shell搜索字符串
查看>>
很蛋碎,都不知道在干什么。。。快疯了。。。。
查看>>
Dapper官方教程翻译9:Dapper方法之参数类型(转)
查看>>
call apply bind sleep
查看>>
【Linux】系统基本命令
查看>>
C语言实现两栈空间共享
查看>>