面向对象编程——类与对象
括号中空的参数列表明确表示没有参数,否则就不能下结论。
(3)客户和服务器模式
在OOP中,如果一个类公开了一些方法供其它类调用,那么这个类被称为服务器,公开的这些方法被称为服务,而调用这些服务的类就是客户。理论上客户类调用服务器类的服务,即客户向服务器发送了一条消息。而客户和服务器的概念是相对而言的,当A类向B类提供了功能接口时,则类A是服务器,B类是客户;如果类B也同时为类A提供了功能接口,则类B是服务器,类A是客户。
设计良好的服务器应该将其实现细节隐藏起来,客户仅需知道服务器提供的接口即可。接口就是客户所能调用的那些函数,这些函数将消息发给服务器,那么服务器就知道客户需要什么样的服务,服务器会返回一些数据给客户,或执行客户所需的任务等。
(4)消息传递和方法调用
在OOP中,类和对象表现为服务器,使用类和对象的模块表现为客户。客户通过特殊的方式请求服务。那么到底如何让对象为我们做有用的事情呢?必须有一种方法能向对象做出请求,使得它能做某件事情,比如,完成交易、在屏幕上画图或打开开关。可以向对象发出的请求是由它的接口定义的,而接口是由类型定义的。
虽然接口规定了我们能向特定的对象发出什么请求,但必须有代码满足这种请求,再加上隐藏的数据就组成了实现。类型对每个可能的请求都有一个相关的函数,当向对象发出请求时,就调用这个函数。这个过程被概括为向对象"发送消息"(提出请求),对象根据这个消息确定做什么(执行代码)。
对象之间的逻辑接口通过消息传递实现,消息是对对象之间通信的的抽象。常见的消息传递方法是直接调用定义于接收方对象中的操作,比如,当对象A调用对象B的一个方法时,对象A就是在向对象B发送一个消息,对象B的响应由其返回值定义,但只有对象的公共方法才能由另一个对象调用。
使用消息传递可以实现松耦合,特别在分析阶段,不用指定接口的细节,比如,同步、函数调用格式和超时等。当全面理解了所有的问题后,接下来就可以决定设计和实现的细节了。通常对象接口可以看成对象与外部世界之间制定的契约,契约是由一组协议定义的,对象参与到这些协议中。接口协议包括前置条件、后置条件和不变量。
前置条件是当该操作被调用时,必须成立的条件。即在调用之前应该校验传入参数是否正确,只有正确才能执行该方法。也就是说,必须在消息发送或接收之前保证为真的条件,这是消息发送者的职责。一旦通过前置条件的校验方法必须执行,且必须保证执行结果符合契约,这就是后置条件。也就是说,后置条件是当该操作完成时,必须成立的条件。即在处理消息时必须保证为真,这是消息接收者的职责。不变量是指在任何时刻都必须成立的条件,包括操作执行前、执行时和执行后。
(5)属性抽象与行为抽象
OO程序设计思想可以采用抽象的方法,对现实世界中的多个具体对象进行概括分析,得到这类对象所具有的共同属性和行为,加以描述就形成了类。虽然都是同一个类的对象,但每个对象的属性不同,于是就形成了不同的具体对象实体。
抽象一般分为属性抽象和行为抽象两种,属性抽象是寻找一类对象共有的属性,比如,在范围值校验器RangeValidator类中,使用整型变量min和max来描述push到栈中的数值范围,然后将min和max变量作为类的成员变量描述对象的属性,即"属性是包含在对象中的变量"。而行为抽象则是寻找这类对象所具有的共同行为特征,比如,对push到栈中的值进行范围值校验,同样,也可以为这个类添加相应的函数,最终将该函数作为类的成员函数描述对象的行为,即"方法是包含在对象中的函数"。
在面向过程的编程中,程序是由模块组成的,一个模块就是一个过程,通常采用自顶而下的设计方法。而面向对象的编程与设计着眼于解决面向过程的编程和自顶而下设计中出现的一些问题,由于在面向对象的编程中构成模块的基本单元是类,而不是过程,因此面向对象设计是面向对象编程的设计方法,它着重于类的设计,通过类的设计完成对实体的建模任务,类建模的目的是描述对象。
在面向过程的编程中,描述一个物体时,数据和方法是分开的。比如,当通过网络发送信息时,则只会发送相关的数据,并认为网络另一端的程序知道如何进行处理。也就是说,如果两者之间没有握手协议,则网络另一端的程序不知道如何处理。而对象可以定义为"同时包含"数据和行为的一个实例,即通过封装机制将数据和行为捆绑在一起,形成一个完整的、具有属性和行为的对象。比如,当通过网络传送对
对象 相关文章:
- 面向对象编程——OO思想(08-27)