面试官问:说说抽象和接口的区别
面试人员:卡卡一顿背书。。。。
在面向对象的概念中,所有对象都是通过类来描述的,但是反过来却不是这样的。
比如我们进行一个编辑软件的开发,里面有三角形,四边形,圆形等具体的概念。
但是他们都属于形态,形态就是一个抽象概念,正是因为有这种抽象概念,所以用于表现抽象概念的抽象类是不能够实例化的。
抽象类更多的是对整体的抽象(表示它是什么),接口是对行为的抽象(表示它能做什么)。
对于这个需求,我们下面的两种方式都可以实现,如果又来一个报警的功能,是不是第一时间想着在下面添加一个报警的方法。这样就违背了我们的接口隔离原则(接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。 在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。)
为了满足这个条件,我们可以使用两个抽象类或者两个接口或者一个抽象类,一个接口来实现。
AlarmDoor在概念本质上是Door,同时它有具有报警的功能。
抽象在java中表示的是一种继承关系,而继承关系的本质上是 “is-a”关系,
所以对于AlarmDoor我们应该用抽象的方式来定义,用接口的方式来实现它的报警行为。