上午题07-面向对象技术
1 类
实体、接口、控制
类是在对象之上的抽象,对象是类的具体化,是类的实例(Instance)。
类可以分为三种:实体类、接口类(边界类)和控制类。
(1)实体类的对象表示现实世界中真实的实体,如人、物等。
(2)接口类(边界类) 的对象为用户提供一种与系统合作交互的方式,分为人和系统两大类,其中人的接口可以是显示屏、窗口、Web 窗体、对话框、菜单、列表框、其他显示控制、条形码、二维码或者用户与系统交互的其他方法。
(3)控制类的对象用来控制活动流,充当协调者。
2 对象和消息
2.1 对象
对象、属性、方法
在面向对象的系统中,对象是基本的运行时的实体,它既包括数据(属性),也包括作用于数据的操作(行为)。所以,一个对象把属性和行为封装为一个整体。封装是一种信息隐蔽技术,它的目的是使对象的使用者和生产者分离,使对象的定义和实现分开。从程序设计者来看,对象是一个程序模块;从用户来看,对象为他们提供了所希望的行为。在对象内的操作通常称为方法。一个对象通常可由对象名、属性和方法 3个部分组成。
每个对象都有它的属性和操作,如电视机有颜色、音量、亮度、灰度、频道等属性,可以有切换频道、增大/减低音量等操作。
电视机的属性值表示了电视机所处的状态,电视机是黑色、电视机的音量很大这些都是状态。
电视机的各组成部分,如显像管、电路板和开关等都封装在电视机机箱中,人们不知道也不关心电视机是如何实现这些操作的。
对象的状态标识了该对象的所有属性,以及每个属性的当前值。
对象共享属性和行为。
2.2 消息
调用
对象之间进行通信的一种构造叫作消息。当一个消息发送给某个对象时,包含要求接收对象去执行某些活动的信息。接收到信息的对象经过解释,然后予以响应。这种通信机制称为消息传递。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。
调用类的方法
ml.changeLevel(2)
3 方法重载
不同的参数去控制同一个方法。
方法同名但是方法参数个数不同,或方法参数类型不同,或方法参数类型顺序不同都是方法重载。指在同一个类中使用相同的方法名,但是参数列表不同,来实现不同的功能。
例如,有一辆车,我们为这辆车定义了一个 run
方法,可以根据不同的参数来控制车辆的运行方式,比如可以传入速度参数、方向参数等,来实现不同的运行效果。
4 封装
封装就像是将一个物品放入一个包裹或容器中,然后提供一个外部接口来与其交互,而不需要了解包裹内部的具体细节。
在编程中,封装是指将数据(属性)和操作(方法)封装在一个对象中,并且只通过对象的公共接口(方法)来访问数据,隐藏了对象内部实现的细节。
想象一辆汽车,我们只需知道如何使用汽车的接口(如方向盘、油门、刹车等),而无需了解汽车的内部引擎或机制。
5 继承
狗类可以继承动物类的属性和方法,如名称、种类、吃等,同时可以在这基础上添加自己特有的行为或属性,如“汪汪叫”和“看门”。
继承可以让一个类(子类)从另一个类(父类)那里继承属性和行为,子类可以重用父类的属性和行为,并且可以在此基础上添加新的属性和行为。
假设有一个动物类(父类),其中包含了共有的属性和行为(如名称、种类、吃、睡等),然后有一个狗类(子类)继承自动物类,狗类可以继承动物类的属性和方法,如名称、种类、吃等,同时可以在这基础上添加自己特有的行为或属性,如“汪汪叫”和“看门”。
6 多态
动物类中有一个叫声的方法 makeSound()
,而狗类和猫类继承自动物类并重写了这个方法。狗类中的 makeSound()
方法会发出汪汪的声音,而猫类中的 makeSound()
方法会发出喵喵的声音。
多态指的是同一个方法可以以不同的形式(参数类型、个数)出现,实现不同的功能。
参数多态是应用比较广泛的多态,被称为最纯的多态。
包含多态在许多语言中都存在,最常见的例子就是子类型化,即一个类型是另一个类型的子类型。
过载(Overloading)多态是同一个名字在不同的上下文中所代表的含义不同。
7 静态、动态绑定
静态绑定在编译,动态绑定在运行。
绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。在一般的程序设计语言中,绑定是在编译时进行的,叫作静态绑定。动态绑定则是在运行时进行的,因此,一个给定的过程调用和代码的结合直到调用发生时才进行。
动态绑定是和类的继承以及多态相联系的。在继承关系中,子类是父类的一个特例,所以父类对象可以出现的地方,子类对象也可以出现。因此在运行过程中,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接,即动态绑定。
8 面向对象设计原则
(1)单一责任原则(Single Responsibility Principle,SRP)。就一个类而言,应该仅有一个引起它变化的原因。即,当需要修改某个类的时候原因有且只有一个,让一个类只做一种类型责任。
(2)开放-封闭原则(Open & Close Pinciple,OCP)。软件实体(类、模块、函数等)应该是可以扩展的,即开放的;但是不可修改的,即封闭的。
(3)里氏替换原则(Liskov Substitution Principle,LSP)。子类型必须能够替换掉他们的基类型。即,在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有是一个(is-a)关系。
(4)依赖倒置原则(Dependence Inversion Principle, DIP)。抽象不应该依赖于细节,细节应该依赖于抽象。即,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
依赖于抽象,而不依赖于细节。
(5)接口分离原则(Interface Segregation Principle,ISP)。不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。即:依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。
依赖于抽象,而不依赖于具体。
上述(1)~(5)是面向对象方法中的五大原则。除了这五大原则之外,Robert C.Martin提出的面向对象设计原则还包括以下几个。
(7)共同封闭原则(Common Closure Principle,CCP)。包中的所有类对于同一类性质的变化应该是共同封闭的。**一个变化若对一个包产生影响,则将对该包中的所有类产生影响,**而对于其他的包不造成任何影响。
(8)共同重用原则(Common Reuse Principle,CRP)。一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
9 面向对象分析与设计
9.1 面向对象分析
认定 组织 描述 确定 定义
面向对象分析包含5个活动:
(1)认定对象、
(2)组织对象、
(3)描述对象间的相互作用、
(4)确定对象的操作、
(5)定义对象的内部信息。
9.2 面向对象设计
3个识别 2个定义
其目标是定义系统构造蓝图。
(1)识别类及对象
(2)定义属性
(3)定义服务
(4)识别关系
(5)识别包
9.3 面向对象测试
(1)算法层
(2)类层
(3)模板层
(4)系统层