[关闭]
@lzb1096101803 2016-03-21T16:37:48.000000Z 字数 1758 阅读 588

选择抽象类还是接口?

电话面试


区别

语法层面上的区别

设计层面上的区别

举例

下面是一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

  1. abstract class Door {
  2. public abstract void open();
  3. public abstract void close();
  4. }

或者:

  1. interface Door {
  2. public abstract void open();
  3. public abstract void close();
  4. }

  但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:

  1. 将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

  2. 将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
      
      从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

  1. interface Alram {
  2. void alarm();
  3. }
  4. abstract class Door {
  5. void open();
  6. void close();
  7. }
  8. class AlarmDoor extends Door implements Alarm {
  9. void oepn() {
  10. //....
  11. }
  12. void close() {
  13. //....
  14. }
  15. void alarm() {
  16. //....
  17. }
  18. }

小结

固有的行为继承抽象类,使所有的类都需要这个行为

附加的行为使用接口,使需要附加行为的类可以有选择的实现这个接口

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注