所有编程语言的最终目的都是提供一种抽象方法一种较有争议的说法是解决问题的复杂程度直接取决于抽象的种类及质量这儿的种类是指准备对什么进行抽象?汇编语言是对基础机器的少量抽象后来的许多命令式语言(如FORTRANBASIC和C)是对汇编语言的一种抽象与汇编语言相比这些语言已有了长足的进步但它们的抽象原理依然要求我们着重考虑计算机的结构而非考虑问题本身的结构在机器模型(位于方案空间)与实际解决的问题模型(位于问题空间)之间程序员必须建立起一种联系这个过程要求人们付出较大的精力而且由于它脱离了编程语言本身的范围造成程序代码很难编写而且要花较大的代价进行维护由此造成的副作用便是一门完善的编程方法学科 为机器建模的另一个方法是为要解决的问题制作模型对一些早期语言来说如LISP和APL它们的做法是从不同的角度观察世界——所有问题都归纳为列表或所有问题都归纳为算法PROLOG则将所有问题都归纳为决策链对于这些语言我们认为它们一部分是面向基于强制的编程另一部分则是专为处理图形符号设计的每种方法都有自己特殊的用途适合解决某一类的问题但只要超出了它们力所能及的范围就会显得非常笨拙 面向对象的程序设计在此基础上则跨出了一大步程序员可利用一些工具表达问题空间内的元素由于这种表达非常普遍所以不必受限于特定类型的问题我们将问题空间中的元素以及它们在方案空间的表示物称作对象(Object)当然还有一些在问题空间没有对应体的其他对象通过添加新的对象类型程序可进行灵活的调整以便与特定的问题配合所以在阅读方案的描述代码时会读到对问题进行表达的话语与我们以前见过的相比这无疑是一种更加灵活更加强大的语言抽象方法总之OOP允许我们根据问题来描述问题而不是根据方案然而仍有一个联系途径回到计算机每个对象都类似一台小计算机它们有自己的状态而且可要求它们进行特定的操作与现实世界的对象或者物体相比编程对象与它们也存在共通的地方它们都有自己的特征和行为 Alan Kay总结了Smalltalk的五大基本特征这是第一种成功的面向对象程序设计语言也是Java的基础语言通过这些特征我们可理解纯粹的面向对象程序设计方法是什么样的 () 所有东西都是对象 可将对象想象成一种新型变量它保存着数据但可要求它对自身进行操作理论上讲可从要解决的问题身上提出所有概念性的组件然后在程序中将其表达为一个对象 () 程序是一大堆对象的组合 通过消息传递各对象知道自己该做些什么为了向对象发出请求需向那个对象发送一条消息更具体地讲可将消息想象为一个调用请求它调用的是从属于目标对象的一个子例程或函数 () 每个对象都有自己的存储空间可容纳其他对象 或者说通过封装现有对象可制作出新型对象所以尽管对象的概念非常简单但在程序中却可达到任意高的复杂程度 () 每个对象都有一种类型 根据语法每个对象都是某个类的一个实例其中类(Class)是类型(Type)的同义词一个类最重要的特征就是能将什么消息发给它? () 同一类所有对象都能接收相同的消息 这实际是别有含义的一种说法大家不久便能理解由于类型为圆(Circle)的一个对象也属于类型为形状(Shape)的一个对象所以一个圆完全能接收形状消息这意味着可让程序代码统一指挥形状令其自动控制所有符合形状描述的对象其中自然包括圆这一特性称为对象的可替换性是OOP最重要的概念之一 一些语言设计者认为面向对象的程序设计本身并不足以方便解决所有形式的程序问题提倡将不同的方法组合成多形程序设计语言(注释) [注释]参见Timothy Budd编着的《Multiparadigm Programming in Leda》AddisonWesley 年出版 |