接口的问题:
一、为什么要有接口,有抽象类或抽象方法做不好的吗?
答案:没有。

二、接口存在的意义
使用抽象类或抽象方法不可避免继承问题。 一些功能性的抽象类或抽象函数随着项目的扩展中和类体系的膨胀进而影响了整个系统类结构的清晰性。考虑如下的类结构:

Gun
  Pistol
  Rifle
    SniperRifle
在CS这个游戏中,我们知道,狙击步枪和部份步枪都带瞄准功能,所以可以考虑在Rifle这个类中定义OpenSight这个函数。

但如果在后继的版本中,出现了一把带瞄准镜的手枪,那么修改这个类体系最容易的方法,就是把OpenSight这个函数上移到Gun类中。但带来的问题是:
一、很多具体的类,完全不需要实现OpenSight,甚至不需要知道OpenSight,但类的继承特性将这个函数都带给了它们。
    
二、在Gun级别如果定义OpenSight是一个抽象函数,那么其它的子类至少得有一个实现(至少是忽略这个操作),这么多的枪支都需要写一个忽略代码,为了避免重复代码的最简单方法就是在Gun级别的OpenSight是一个虚函数,默认就是忽略,若要实现的类再对这个方法进行覆盖并重写。这个处理方法明显的有点混乱。

三、个人认为最重要的一点,就是随着项目的扩展类体系也在膨胀,最后多个不清晰的设计压垮了系统。关于这一点,只有自己写的代码把自己绊倒过人,才有真实的体会。例子总是尽可能的简单来快速说明问题,但压垮骆驼的,不是第一根稻草,也不是第100根稻草。所以你在看网络上关于接口的各种文档时,你能找到的任何一个示例,也许都不能说明接口比抽象类和抽象函数有更好的优越性(至少对我而言是这样)。

个人认为接口存在的意义是将类系统的类本质和非类必须的功能进行了清晰的划分,非类必须的功能,应该申明为接口。如上面所举例的OpenSight这个函数。但如果我们把Fire和Full这两个类本质的函数声明为了接口,那么可能就设计过头了。

但我总结的存在意义在某种意义也是很扯淡的,因为人的能力不同,所以识别和划分出来的接口也不相同,最终能不能带来清晰的设计,那是另一会事。并不是使用了接口,系统的设计就必然变好。

其它的一些网络上的观点和我的认识:
一、使用接口进行通信是接口的优点,使编程可以并行。这也许是对的,但以数据库编程为例,任何一个层,每个程序员都需要知道自己要处理的实体(表或视图)的结构和业务意义,这就完全破坏了所谓各层独立的说法。
二、面向接口编程是更先进的编程思想。这个很扯淡,别忘记了实现代码还写在类中。且我们根本无法举例一个完全是面向接口来设计的系统。接口是对类系统组织上的完善。
三、一个人写的系统不需要接口。去维护一个你5年前写的3万行以上代码的项目试试。

在网络上找到我认为好的简要总结:
一、接口优缺点一句话总结:对扩展开放,对修改关闭。
二、一旦公开接口发布之后,它就不能被修改了。所以接口的职责应该尤其单一。
三、如果使用接口但是希望可扩展,那么仍然考虑使用抽象类:因为我们可以向类中添加新的成员——只要这个新成员不是abstract的,就不会破坏外部已经出现的依赖。不过加上之后,API设计是否合理,语义是否清晰,就是另一回事情了
四、类是静态的抽象(事物的本质,特性等),而接口是动态的抽象(事物的行为等),选择抽象类与接口,我的看法是,对一类事物进行抽象用抽象类,对行为进行抽象时用接口中。

我认为接口存在的意义相关推荐

  1. 用了N年的接口,你知道接口是什么吗?——一个简单实例说明接口的伟大意义...

    ASP.NET基础知识:简单的实例理解接口的伟大意义 WestGarden 2012-5-26 http://www.cnblogs.com/WestGarden/ 源代码:13033480群共享 首 ...

  2. JAVA中接口存在的意义

    很多JAVA程序员对于接口存在的意义很疑惑.不知道接口到底是有什么作用,为什么要定义接口.好像定义接口是提前做了个多余的工作.下面我给大家总结了4点关于JAVA中接口存在的意义: 1.重要性:在Jav ...

  3. 身份证实名认证API接口有什么意义与作用?

    身份证实名认证API接口有什么意义? 中国公民的身份证是一种对外证明自己身份的有效证件,随着国家对实名制要求的落实,工作与生活中许多场景都会需要进行身份验证.比如出门外出乘座火车与飞机时.注册互联网络 ...

  4. java抽象类和接口有什么意义

    用了java这么久,对接口和抽象类使用一直很模糊.为什么接口和抽象类不能实例化,为什么接口可以多个实现而抽象类只能单继承,特别是java8之后,抽象类和接口里面都可以写代码后,就更加分不清了,今天重新 ...

  5. Java接口存在的意义以及如何解决菱形继承问题

    可以说接口存在的目的就是为了解决菱形继承问题.我们用例子来去讲解这个问题. 多重继承 最好的办法就是使用多重继承 新建一个宠物类,让猫和狗都去继承宠物类的属性和方法.但是这样就会导致一个问题.即菱形继 ...

  6. php接口是什么,PHP中的接口有什么意义?

    TVBK 接口我也是一直搞不明白..根据你的说法,我这样理解对吗? 小G负责写 狗class,小M负责写猫class 现在新增一个功能 我按按钮它就叫.不论是 狗class 还是 猫class 都得继 ...

  7. JavaSE学习总结(六)——接口、抽象类、内部类

    一.不需要实例化的原因 看一个示例: package com.zhangguo.chapter5.s1;/**动物园*/ public class Zoo {public static void ma ...

  8. Java中的接口命名[关闭]

    本文翻译自:Interface naming in Java [closed] Most OO languages prefix their interface names with a capita ...

  9. linux系统修改接口名称,linux – 改变网络接口的名称,debian wheezy

    我正在尝试为接口设置名称,"ethLan"而不是eth0.这样做还可以确保if的名称在每次重新启动和内核时都保持一致. 我按照他们的说法做了,并将ethLan mac添加到/ et ...

最新文章

  1. __builtin__与__builtins__的区别与关系
  2. 如何在工作中快速成长?致工程师的10个简单技巧
  3. 未来数据中心运营将靠人工智能和机器学习
  4. tp和 vue 管理后台管理系统_vue-antd后台管理系统
  5. dotNET Core:编码规范
  6. Jodd - Java界的瑞士军刀轻量级工具包
  7. java 修改ini文件_Java读取和修改ini配置文件
  8. 春节福利:《Oracle性能优化与诊断案例精选》电子版首次公开下载
  9. 力排众议,自由软件之父 RMS 正式回归 FSF!
  10. TypeScript入门学习笔记
  11. C#通过NOPI读写Excel,并插入图片,VS2019
  12. mac 安装虚拟机win11
  13. ie上传文件到ftp服务器,通过浏览器上传文件到ftp
  14. C语言_循环队列具体实现
  15. Solution of ZOJ 2748 Free Kick
  16. python虚拟机:pvm
  17. 嵌入式编程与PC编程有何区别
  18. win10中conda activate激活环境出错的解决办法
  19. 高德地图红绿灯读秒是怎么实现的?(一)
  20. PVLAN 技术介绍

热门文章

  1. 化工行业动态:华峰化学业绩超预期,新增推荐标的_中泰化学(20210117).PDF
  2. java生成图片二维码
  3. 七年级上册英语第三单元单词课文翻译
  4. 2017年东南大学蒙纳士553C++编程题
  5. Spark并行度的设定
  6. Oracle数据库打补丁方法
  7. 视频剪辑用计算机,剪辑视频用的电脑该如何配置 真的配置越高越好?
  8. 干货|如何用开放性来做管理
  9. OWASP TOP 10-2021年十大Web应用安全风险榜单
  10. Java中的compare方法和conpareTo方法使用详解