那都没有说错,但没有说的问题的关键.为什么接口跟抽象类有那些不同,这些不同的根源是什么?根源是它们的真正含义,或说作用是截然不同的.不同在哪里?一言以辟之, "抽象类是为了把相同的东西提取出来,就是为了重用;而接口的作用程序里面固化的契约,是为了降低偶合."下面进行详细阐述.
先说抽象类,它的作用归根到底其实就是为了重用.这个重用包含几个层次的重用,都知道的方法重用,几个类有共同的特质,我们就把他们公用的东西提取出来,搞了个父类,而这个父类有些方法不知道怎么实现,就搞成抽象的吧.所以抽象类就诞生了.还有一个重用层次是结构的层次,很典型的就是 Template模式,它重用的不是一般的方法,而是做某类事情的通用算法,我称之为结构的重用.
再谈接口,这是我想重点说的,因为我想让接口真正回归它本来的面目.接口就是契约,软件系统内部的契约.那电脑硬件打比方,内存条的卡口就规定好多长,卡位在哪.这样造主板的按这个契约留好口,造内存的外形也按这个造,都造好了,才能工作.任何一方不守规矩,直接导致造电脑失败.这个造电脑,主板跟内存接口是什么?是我们看到的主板上那个卡口吗?不是,接口是内存厂商跟主板厂商之间的契约,这份契约可能是一份双方签字的文档,也可能是一个电话达成的共识. 而编程语言的接口Interface,就对应那分签字的文档或是一个电话的共识,只是它是程序化了的,相关双方都没有办法违约的;我告诉你了我要这个接口,你也答应实现,那你就必须实现,否则编译就过不了;所以它是一种固化的强制的契约.
搞清楚了接口跟抽象类的这个本质区别,它们真正的作用.就不会再说"这个地方,用抽象类还是接口都可以"这样的话.也许的确是都可以,但是该用哪个呢?