关于抽象类和接口之间的区别

抽象类和接口之间的关系

网上有许多文章讲解抽象类和接口之间的关系,但大多偏重于特定的语言语法或设计理念,感觉与程序员希望得到的答案有些距离。作为一个开发者,抽象类与接口之间的语法区别只要查看相应的语言手册即可,而设计理念上的区别与实际开发并没有多大关系。抽象类和接口究竟有什么区别?如果我的回答是:
1。类可以实现多个接口而只能继承一个超类。
2。抽象类可以有非抽象方法而接口的方法只能都是抽象的。
3。抽象类可以定义和使用变量而接口则不可以。
4。抽象类中的方法可以有各种不同的修饰符,而接口中的方法默认都是public,不允许字面定修饰符。
你觉得上述回答对你的开发、对你理解面向对象编程又帮助吗?如果你觉得有,打住,你不必往下看了。我相信你google来的大多数文章都是这样的回答。
其实,实际开发者想知道的是:我在开发项目时,什么时候应当使用interface,什么时候应当使用abstract class?
如果你是个刚刚出校门的学生,理解上述四点足够,剩下的靠你在编程经验中慢慢感悟;
如果你是个有一年以上经验的java/C#程序员,你或许已经隐约“感悟”到其中的差异但又讲不清楚。
我这里就试着讲清楚些。
1。从类的层次结构上看,抽象类通常是在层次的顶端,但在实际的设计实践当中,抽象类应当是最后出现的,换句话说,应当是先有具体类后有抽象类。为什么?实际上抽象类的获取有点像数学中的提取公因式:ax+bx+cx,x就是抽象类,如果你没有前面的式子,你怎么知道x是不是公因式呢?在这点上,也符合人们认识世界的过程,先具体后抽象。因此在设计过程中如果你得到大量的具体概念并从当中找到其共性时,这个共性的集合就是抽象类应当是没错的。
2。interface从表面上看,和抽象类很相似,但用法完全不同。它的基本功能就是把一些毫不相关的类(概念)集合在一起形成一个新的、可集中操作的“新类”。我给学生的一个典型例子就是“司机”。谁可以当司机?谁都可以,只要领取了驾照。所以我不管你是学生,白领、蓝领还是老板,只要有驾照就是司机。
interface Driver {
    Licence getDriverLicence();
}

class StudentDriver implements Driver {
}
class WhtieCollarEmployeeDriver implements Driver {
}
class BlueCollarEmployeeDriver implements Driver {
}
class BossDriver implements Driver {
}

当我定义了“汽车”类后,我就可以指定“司机”了。

class Car {
    setDriver(Driver driver);
}
这时候,Car的对象并不关心这个司机到底是干什么的,他们的唯一共同点是领取了驾照(都实现了DriverLicence接口)。这个,应当是接口最强大的地方也是抽象类无法比拟的。

总结:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是这里关心的重点。

 

你可能感兴趣的:(关于抽象类和接口之间的区别)