什么时候应当使用interface?什么时候应当使用abstract class?
2008-04-05 23:04
363 查看
以下内容转载于CNBLogs 我最近也在为什么时候该用接口什么时候该用抽象类苦恼,老实说,对语言(language specification)来说,我确实可以说我“精通C#”,但这什么时候该用呢?
这篇文章本身也是在说language specification,幸好,下边的一篇评论写到了,实在万幸感谢dunai。
“什么时候应当使用interface,什么时候应当使用abstract class。如果你是个有一年经验的java/C#程序员,你或许已经“感悟”到其中的差异但又讲不清楚。我这里试着讲清楚些。
1。从类的层次结构上看,抽象类通常是在层次的顶端,但在实际的设计实践当中,抽象类应当是最后出现的。为什么?实际上抽象类的获取有点像数学中的提取公因式:ax+bx+cx,x就是抽象类,如果你没有前面的式子,你怎么知道x是不是公因式呢?在这点上,也符合人们认识世界的过程,先具体后抽象。因此在设计过程中如果你得到大量的具体概念并从当中找到其共性时,这个共性的集合就是抽象类应当是没错的。
2。interface从表面上看,和抽象类很相似,但用法完全不同。它的基本功能就是把一些毫不相关的类(概念)集合在一起形成一个新的、可集中操作的“新类”。我给学生的一个典型例子就是“司机”。谁可以当司机?谁都可以,只要领取了驾照。所以我不管你是学生,白领、蓝领还是老板,只要有驾照就是司机。
interface Driver {
Licence getDriverLicence();
}
class StudentDriver extends Student implements Driver {
}
class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements Driver {
}
class BlueCollarEmployeeDriver extends BlueCollarEmployee implements Driver {
}
class BossDriver extends Boss implements Driver {
}
当我定义了“汽车”类后,我就可以指定“司机”了。
class Car {
setDriver(Driver driver);
}
这时候,Car的对象并不关心这个司机到底是干什么的,他们的唯一共同点是领取了驾照(都实现了DriverLicence接口)。这个,应当是接口最强大的地方也是抽象类无法比拟的。
总结:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。 ”
这篇文章本身也是在说language specification,幸好,下边的一篇评论写到了,实在万幸感谢dunai。
“什么时候应当使用interface,什么时候应当使用abstract class。如果你是个有一年经验的java/C#程序员,你或许已经“感悟”到其中的差异但又讲不清楚。我这里试着讲清楚些。
1。从类的层次结构上看,抽象类通常是在层次的顶端,但在实际的设计实践当中,抽象类应当是最后出现的。为什么?实际上抽象类的获取有点像数学中的提取公因式:ax+bx+cx,x就是抽象类,如果你没有前面的式子,你怎么知道x是不是公因式呢?在这点上,也符合人们认识世界的过程,先具体后抽象。因此在设计过程中如果你得到大量的具体概念并从当中找到其共性时,这个共性的集合就是抽象类应当是没错的。
2。interface从表面上看,和抽象类很相似,但用法完全不同。它的基本功能就是把一些毫不相关的类(概念)集合在一起形成一个新的、可集中操作的“新类”。我给学生的一个典型例子就是“司机”。谁可以当司机?谁都可以,只要领取了驾照。所以我不管你是学生,白领、蓝领还是老板,只要有驾照就是司机。
interface Driver {
Licence getDriverLicence();
}
class StudentDriver extends Student implements Driver {
}
class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements Driver {
}
class BlueCollarEmployeeDriver extends BlueCollarEmployee implements Driver {
}
class BossDriver extends Boss implements Driver {
}
当我定义了“汽车”类后,我就可以指定“司机”了。
class Car {
setDriver(Driver driver);
}
这时候,Car的对象并不关心这个司机到底是干什么的,他们的唯一共同点是领取了驾照(都实现了DriverLicence接口)。这个,应当是接口最强大的地方也是抽象类无法比拟的。
总结:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。 ”
相关文章推荐
- abstract class和interface的使用场景分别是什么?
- 19.abstract class和interface有什么区别?
- 什么时候应该使用Web Service
- 什么时候使用值类型?什么时候使用引用类型?
- 老男孩教育每日一题-2017年5月19日-使用find命令的时候 |xargs(管道xargs)与-exec有什么区别?
- abstract class和interface有什么区别?
- 抽象类(abstract class)和接口(interface)有什么异同?
- 【Hibernate】中Query对象在获取表的所有的数据的时候,使用list()和 iterator()有什么区别?
- How to Use updateConstraints(什么时候该使用updateConstraints)
- 创建字符串对象的时候,使用字面值和使用new String()构造器这两种方式有什么不同?
- 什么时候该使用指针和引用
- 抽象类(abstract class)和接口(interface)有什么异同?
- 什么时候使用分析器
- JAVA内部类使用,什么时候该使用内部类及使用内部类的好处
- abstract class和interface有什么区别
- vba编程不知道该使用什么对象属性方法实现操作的时候用宏录制来查阅代码
- JAVA内部类使用,什么时候该使用内部类及使用内部类的好处
- java abstract class和interface有什么区别
- abstract class和interface有什么区别
- 什么时候该使用前置声明?