程序员过关斩将-- 工作好多年可能还未真正了解接口和抽象类

点击上方“蓝字”关注我们

菜菜哥,我偷偷出去面试了,然后面试官让我回来等消息

那你可能挂了呀,有什么问题没回答上来吗

确实有一个问题回答的不太好哎,就是接口和抽象类

这个确实是面试官比较爱问的题目之一

那能不能说说接口和抽象类的区别呢?

可以哦,顺便还可以再延伸一下,先抛几个问题哦

1. 抽象类和接口的定义和区别?

2. 抽象类在面向对象编程中解决了什么问题?

3. 接口在面向对象编程中解决了什么问题?

4. 如何决定该用抽象类还是接口?

5. 如果使用的语言不支持抽象类和接口,该如何应对?

抽象类

在面向对象编程的语言中,多数都添加了对抽象类和接口的支持,比如最常用的java,C#等语言。

//抽象类public abstract class Human{//抽象方法public abstract string Gender();//属性public string Name { get; set; }//方法public int GetAge(){return 1;}}

以上是一个普通的抽象类的定义,具体怎样使用,度娘有一大堆结果,其实总体来说抽象类主要有以下几点特征:

1. 抽象类不能被实例化,只能被继承。也就是说如果 New Human()会报编译错误

2. 抽象类也是类,可以包含属性和方法,方法可以包含实现,也可以不包含,不包含实现被称为抽象方法。

3. 子类继承抽象类,必须要实现定义的所有抽象方法,不然编译器会报编译错误。

抽象类本质上还是类,只不过是一种不能被实例化的特殊类而已,但是在面向对象的设计过程中却起着非常重要的地位,本质上抽象类体现的是is-a的关系,就像上边定义的抽象类一样,Human类型抽象的是人类,假如我定义一个菜菜的类型来继承这个类型 

 public class CaiCai : Human{public override string Gender(){return "男";}}

CaiCai这个类必须要提供抽象方法的实现才可以通过编译。抽象类的产生是面向对象开发思想的延伸,是解决代码复用问题的一个方案,更是把代码进行抽象化的一个结果。抽象类的设计思想是自下而上的,也就是说设计上应该先有子类,当子类逐渐增加,进而抽象出共用特性而产生抽象类。

说到这里,好多同学会问,如果我不用抽象类做父类也可以啊。不错,普通的类当然也可以代替抽象类的地位。但是有几点就看起来比较奇怪了

1. 父类也可以进行实例化了,但是其中要抽象的方法看起来就比较怪了,因为这些方法只有子类中才有明确的定义,比如 以上代码中Human这个类如果修改为普通类型,那方法Gender()该返回什么内容呢?

2. 在编译期间,如果子类没有实现父类的方法是不会报错的,这就加大了排查问题的难度,如果需要重写的方法很多,之后排查问题会非常头疼

3. 抽象出来的父类如果可以被实例化,这本质上违反了面向对象的思想,毕竟父类是一个抽象化的概念,被实例化之后代表着什么比较令人困惑

接口

接口在系统设计中,最重要的作用就是解耦。你应该听过不止一次的“面向接口编程”和依赖倒置等思想,这些也是面向对象设计思想的一种体现。接口本质上是抽象出来的对象的行为,或者叫做契约。在面向接口开发中,调用者不关心接口的实现,而是依赖于接口的定义,接口定义的稳定性代表着一个系统的稳定性,如果一个系统对外的接口定义有问题,那这个系统多半是会死人的。

    public interface IHuman{//接口行为定义void Walk();}

以上只是一个简单接口的定义而已,接口的抽象小到可以是一个对象的行为抽象,大到可以是一个服务的行为抽象,更有可能是一个系统的行为抽象,所以接口是一个很泛的概念,但是本质上还是反应的是面向对象设计理念。由于接口是行为的定义,所以就决定了它有以下特点

1. 接口只能定义行为,不能包含行为的实现

2. 类型继承接口的时候,必须要实现接口的所有行为

3. 接口不同于类,不能包含属性

由于接口体现的是行为准则,所以接口在定义的时候也可以利用面向对象设计理念,当多个不同接口定义了相同的行为,可以考虑抽象出更上层的接口来实现行为的复用。

写在最后

抽象类和接口都是对象的抽象行为产生的,只不过抽象类更加侧重于 is-a 的关系,它实现了代码复用,而接口更加侧重于行为的抽象(has -a),举一个很简单的栗子,如果设计一个鸟类的抽象该怎么做呢?不同的鸟可能羽毛的颜色不一样,像这样的属性可以利用抽象类,不同的鸟类可能会有不同的飞行行为,这样行为类的抽象利用接口来实现更加合适。

无论是接口还是抽象类,在代码层次上体现的是上下级关系,就算一个编程语言没有提供接口和抽象类的定义,只要能实现对象上下级关系,原理上也可以实现面向对象编程。编程的抽象思想始终在围绕着上下,内外这几个维度在合理的进化着。

说到接口的定义,其实还可以在泛化一下,接口中只有行为方法的定义,在一些不支持接口的编程语言中,可以把只包含方法的类看做接口的抽象定义,这在设计理念上是说的通的。

在继承层次上和设计流程上,抽象类是一种自下而上的设计思路,先有子类的代码,当子类逐渐增多,才会抽象出更加上层的父类。而接口不同,面向接口编程是一种自上而下的设计思路,先抽象出行为契约,然后才是实现。

●程序员过关斩将-- 喷一喷坑爹的面向UI编程

●程序员过关斩将--redis做消息队列,香吗?

●程序员修神之路--有了容器为什么kubernetes还需要Pod?

●程序员修神之路--为什么我会了SOA,你们还要逼我学微服务?

●程序员过关斩将--要想获取我的用户信息,就得按照规矩来

●程序员过关斩将--更加优雅的Token认证方式JWT

●程序员过关斩将--cookie和session的关系其实很简单

●程序员修神之路--用NOSql给高并发系统加速

●程序员修神之路--高并发系统设计负载均衡架构

●程序员过关斩将--你为什么还在用存储过程?

●程序员修神之路--问世间异步为何物?

●程序员修神之路--提高网站的吞吐

长按添加菜菜好友

关注后回复:“大礼包”和“福利”,领取惊喜

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与索引-- mysql InnoDB存储引擎索引

索引与算法 索引是我们在应用开发过程中程序数据可开发的一个重要助力。也是一个重要的研究方向,索引太多,应用的性能可能受到影响,如果索引太少,对查询性能又会有制约。我们需要找到一个合适的平衡点,这个对性能至关…

扫盲消息队列 | 消息中间件 | Kafka

先吐槽我真的写技术文章写到怀疑人生,我翻看历史发文记录,只要我一本正经的写的技术文章,都没人看,但是!一发闲扯淡的内容,阅读量肯定是技术文的好几倍(读者爸爸们别这么搞嘛)这说明…

数据结构与索引-- B+树索引

B树索引 上一节中我们讨论的都是B树的数据结构的由来以及他的一些操作,B树索引在本质就是B树在数据库中的一个实现,但是B索引在数据库中有一个特点就是他的高扇出性,因此在数据库中,B树的高度一般是2~3层,也就是对于查…

7种方法帮助企业改进软件维护效率

前言为了更高效地维护软件,同时为新的软件开发创造尽可能多的时间,以下为你介绍一些企业采取的方法和步骤。2019年,Tiedlift,一个开源支持和维护的企业,对软件开发人员进行了一项调查,结果显示,…

数据结构与索引-- mySql索引诡异事件

什么时候使用B树索引 并不是所有查询条件下出现的列都需要添加索引。对于什么时候添加索引,我们通过经验判断,访问表中很少一部分行时候,使用B树索引才有意义。对于性别字段,地区字段,类型字段,他们取值范…

[Java基础]抽象类和接口的区别

抽象类和接口的区别:

async,await执行流看不懂?看完这篇以后再也不会了

昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就不知道await,async有…

如何分析EFCore引发的内存泄漏

调查实体框架核心中的内存泄漏不要让内存泄漏成为洪水术语“内存泄漏”和“ .NET应用程序”不是经常一起使用。但是,我们最近在一个.NET Core Web应用程序中出现了一系列内存不足异常。事实证明,此问题是由Entity Framework Core中的行为更改引起的&…

数据结构与算法-- 二叉树中和为某一值的路径

二叉树中和为某一值的路径 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径。从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径。我们用二叉树节点的定义沿用之前文章中 二叉查找树实现原理定义。如下&#xff…

微服务统计,分析,图表,监控, 分布式追踪一体化的 HttpReports 在 .Net Core 的应用...

前言介绍HttpReports 是针对.Net Core 开发的轻量级APM系统,基于MIT开源协议, 使用HttpReports可以快速搭建.Net Core环境下统计,分析,图表,监控,分布式追踪一体化的站点, 适应.Net Core WebAPI,MVC,Web项目, 通过引用Nuget构建Da…

WPF 创建自定义面板

前面两个章节分别介绍了两个自定义控件:自定义的ColorPicker和FlipPanel控件。接下来介绍派生自定义面板以及构建自定义绘图控件。创建自定义面板是一种特殊但较常见的自定义控件开发子集。前面以及介绍过有关面板方面的知识,了解到面板驻留一个或多个子元素&#x…

vue.js中mock本地json数据

vue.js中mock本地json数据 新版本的vue项目中已经将dev-server.js,dev-client.js两个js文件合并到了webpack.dev.conf.js文件中,以下分别是新旧版本的build目录结构: 新版本: 旧版本: 本次验证mock:运…

互联网40岁失业是一个无法打破的魔咒吗?

最近刚刚过完生日,又大了一岁,距离40岁又进了一步。年纪大了,就要多复盘。最近几天思考的比较多,因为身边失业的朋友开始多了起来。我又有点陷入担忧、焦虑的心态了。好在我一直是个有阿Q精神的中年油腻男,很快安抚好自…

数据结构与算法--复杂链表的复制

复杂链表的复制 题目:实现一个函数complexListNode 复制一个复杂链表。在链表中,每个节点除了有一个next指针指向下一个节点,还有另外一个before节点,before节点指向链表中任意一个节点,或者null节点。链表节点定义使…