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),举一个很简单的栗子,如果设计一个鸟类的抽象该怎么做呢?不同的鸟可能羽毛的颜色不一样,像这样的属性可以利用抽象类,不同的鸟类可能会有不同的飞行行为,这样行为类的抽象利用接口来实现更加合适。

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

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

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

工作好多年可能还未真正了解接口和抽象类相关推荐

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

    点击上方"蓝字"关注我们 菜菜哥,我偷偷出去面试了,然后面试官让我回来等消息 那你可能挂了呀,有什么问题没回答上来吗 确实有一个问题回答的不太好哎,就是接口和抽象类 这个确实是面试 ...

  2. 为什么开发人员工作10多年了还会迷茫?没有安全感?

    眼看自己大学毕业后都快12年了,也快2个孩子的爸爸了,但是有时候还是会有不少不安全的感觉产生.都快奔35了,技术也过得去,收入其实也很稳定,但是偶尔还是会有迷茫的时候,最近有几个朋友,也发QQ聊天信息 ...

  3. 为什么开发人员工作10多年了还会迷茫?

    眼看自己大学毕业后都快12年了,也快2个孩子的爸爸了,但是有时候还是会有不少不安全的感觉产生.都快奔35了,技术也过得去,收入其实也很稳定,但是偶尔还是会有迷茫的时候,最近有几个朋友,也发QQ聊天信息 ...

  4. iPIN CEO 杨洋:AI 还未被大规模用在工作中,缺的是认知智能

    iPIN CEO 杨洋:AI 还未被大规模用在工作中,缺的是认知智能 本文作者:叨叨 2017-08-06 10:49 导语:如果一个技术不能解决问题,是没有价值的. 雷锋网(公众号:雷锋网)按:8 ...

  5. 谈谈一只菜鸟转行Erlang游戏服务端的经历(希望大佬指导,也希望我的经历能给一些还未毕业的同学或者正在迷茫自己工作内容的同学一些感触)

    入行半年Erlang游戏服务端的心得体验 个人经历 转方向后的工作经历 工作中遇到的问题和处理 一些游戏服务端开发的体验和想法 最后谈谈自己现在面临的问题 第一次发文章,主要想谈谈自己近半年来的心路历 ...

  6. 自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机

    自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索.推荐以及算法相关工作.多年来主要从事推荐系统以及机 ...

  7. 川大优秀毕业生在GitHub上建了一个项目《深度学习500问》,还未完结就获赞无数

    近年来,深度学习在语音.图像.自然语言处理等领域都取得了非常不错的成果,自然而然地成为技术人员争相学习的热点. 为了帮助正在学习深度学习的伙伴们,川大的一名优秀毕业生,在GitHub上创建了一个项目: ...

  8. 解读人工智能产业的2020:认知AI还未实现,我们仍然正在路上

    来源 | AI前线         作者 | 李冬梅 采访嘉宾 | 唐杰 2020 年是一个不平凡的年份.尽管全球遭遇新冠疫情,但是人工智能技术发展和学术研究依旧稳步向前.技术与产业融合也进一步扩大和 ...

  9. 中国目前还未掌握的核心技术有哪些?(无图)

    中国目前还未掌握的核心技术有哪些? 1.A半导体加工设备 基本被日本,美国霸占,看intel的最佳供应商就知道了.不同的是中国想买有些国外设备,别人不卖. 目前蚀刻设备精度最高的是日立.其实看看英特尔 ...

最新文章

  1. java五大原则_Java面向对象的三大特征和五大原则
  2. 队列的C语言实现(通过内核链表)
  3. SQLServer禁用、启用外键约束
  4. 为什么说spark不稳定
  5. python发送邮件脚本_python-发邮件脚本
  6. mysql免安装5.7.17_mysql免安装5.7.17数据库配置
  7. Markdown插图片模板
  8. 安卓电子市场_关于安卓手机发展史你知道多少?原来最早安卓居然不是手机系统!...
  9. func服务器报警显示C,serve_func.c
  10. Ionic 学习笔记
  11. 只要3分钟免费的快速部署自己的网易云API(一)
  12. 学校计算机怎么连接自己的热点,笔记本电脑怎么连接手机热点(手机热点开启及连接方法)...
  13. 调用百度AI开放平台实现图片文字识别
  14. 理科生学计算机数字媒体方向,文科生,理科生,分别可以报哪些专业?5分钟了解文理报考大方向...
  15. 科研日志--python大文件打开内存溢出
  16. Win 10 运行软件报‘MSCOMCTL.OCX‘缺失怎么办
  17. 转载 学写钢笔字应该注意些什么
  18. 【ML复习】什么是 监督学习,什么是 非监督学习?二者的区别是什么?列举常见的 监督学习算法 和 非监督学习算法。
  19. ROS melodic+Astra s编译运行ros_astra_camera实录(踩坑没填完)
  20. nexus7二代升级android8,添横屏模式 Nexus7升级至Android4.1.2

热门文章

  1. 红安一中高考2021成绩查询,红安一中2019高考喜报成绩、一本二本上线人数情况...
  2. layer 同步调用_YYText源码解读-YYText同步/异步渲染流程(一)—UIView与CALayer
  3. java 认证和授权_SpringSecurity一:认证和授权
  4. ae在哪里直接复制合成_AE模板里修改复制的合成如何不影响原先的合成?
  5. 电商BANNER灵感背景欣赏|平面设计中的极简风格
  6. UI素材模板|数据可视化APP界面
  7. Windows开发时IsWindowVisible返回错误的处理方法
  8. 进程(Process)和线程(Thread)的区别
  9. NMI watchdog: BUG: soft lockup - CPU#2 stuck for 23s!
  10. QNX Software Development Platform