《程序设计与数据结构》——什么是类?
任务等。
(4)消息传递和方法调用
在OOP中,类和对象表现为服务器,使用类和对象的模块表现为客户。客户通过特殊的方式请求服务。那么到底如何让对象为我们做有用的事情呢?必须有一种方法能向对象做出请求,使得它能做某件事情,比如,完成交易、在屏幕上画图或打开开关。可以向对象发出的请求是由它的接口定义的,而接口是由类型定义的。
虽然接口规定了我们能向特定的对象发出什么请求,但必须有代码满足这种请求,再加上隐藏的数据就组成了实现。类型对每个可能的请求都有一个相关的函数,当向对象发出请求时,就调用这个函数。这个过程被概括为向对象"发送消息"(提出请求),对象根据这个消息确定做什么(执行代码)。
对象之间的逻辑接口通过消息传递实现,消息是对对象之间通信的的抽象。常见的消息传递方法是直接调用定义于接收方对象中的操作,比如,当对象A调用对象B的一个方法时,对象A就是在向对象B发送一个消息,对象B的响应由其返回值定义,但只有对象的公共方法才能由另一个对象调用。
使用消息传递可以实现松耦合,特别在分析阶段,不用指定接口的细节,比如,同步、函数调用格式和超时等。当全面理解了所有的问题后,接下来就可以决定设计和实现的细节了。通常对象接口可以看成对象与外部世界之间制定的契约,契约是由一组协议定义的,对象参与到这些协议中。接口协议包括前置条件、后置条件和不变量。
前置条件是当该操作被调用时,必须成立的条件。即在调用之前应该校验传入参数是否正确,只有正确才能执行该方法。也就是说,必须在消息发送或接收之前保证为真的条件,这是消息发送者的职责。一旦通过前置条件的校验方法必须执行,且必须保证执行结果符合契约,这就是后置条件。也就是说,后置条件是当该操作完成时,必须成立的条件。即在处理消息时必须保证为真,这是消息接收者的职责。不变量是指在任何时刻都必须成立的条件,包括操作执行前、执行时和执行后。
(5)属性抽象与行为抽象
OO程序设计思想可以采用抽象的方法,对现实世界中的多个具体对象进行概括分析,得到这类对象所具有的共同属性和行为,加以描述就形成了类。虽然都是同一个类的对象,但每个对象的属性不同,于是就形成了不同的具体对象实体。
抽象一般分为属性抽象和行为抽象两种,属性抽象是寻找一类对象共有的属性,比如,在范围值校验器RangeValidator类中,使用整型变量min和max来描述push到栈中的数值范围,然后将min和max变量作为类的成员变量描述对象的属性,即"属性是包含在对象中的变量"。而行为抽象则是寻找这类对象所具有的共同行为特征,比如,对push到栈中的值进行范围值校验,同样,也可以为这个类添加相应的函数,最终将该函数作为类的成员函数描述对象的行为,即"方法是包含在对象中的函数"。
在面向过程的编程中,程序是由模块组成的,一个模块就是一个过程,通常采用自顶而下的设计方法。而面向对象的编程与设计着眼于解决面向过程的编程和自顶而下设计中出现的一些问题,由于在面向对象的编程中构成模块的基本单元是类,而不是过程,因此面向对象设计是面向对象编程的设计方法,它着重于类的设计,通过类的设计完成对实体的建模任务,类建模的目的是描述对象。
在面向过程的编程中,描述一个物体时,数据和方法是分开的。比如,当通过网络发送信息时,则只会发送相关的数据,并认为网络另一端的程序知道如何进行处理。也就是说,如果两者之间没有握手协议,则网络另一端的程序不知道如何处理。而对象可以定义为"同时包含"数据和行为的一个实例,即通过封装机制将数据和行为捆绑在一起,形成一个完整的、具有属性和行为的对象。比如,当通过网络传送对象时,则传送的是整个对象。因此使用OO技术的程序实际上就是多个对象的集合,这里的"同时包含"正是OO程序设计与面向过程程序设计方法的重要区别。
由此可见,以后在分析新的对象时,都要从属性和行为两个方面进行抽象和概括,提取对象的共同特征,而整个抽象过程是一个从具体到一般的过程。如果说抽象是将很多对象的共有特征提取出来成为类的成员属性和成员函数,那么封装机制则是将这些特征进行有机地结合形成一个完整的类。
>>> 1.1.3 封装
类和对象既是独立的概念,又密切相关。每个对象都是某个类的一个实例,每个类都有0或多个实例。对于所有的应用来说,类几乎都是静态的。这就意味着,对象一旦被创建,它的类就确定了。
虽然最具挑战的是如何确定类和对象
周立功 相关文章:
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)