我认为接口存在的意义

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

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

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

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

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

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

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

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


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


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值