对象的属性(properties), 消息传递(message passing), 可到达性(navigability)
- 对象模型
- 数据 + 操作
-
冒号后面的Part : 类名
-
下划线 : 表示一个具体的对象
-
冒号前面的myScrew : 对象的名字
-
对象的属性
- 状态 : 对象中数据的集合
- 行为 : 对象中函数的集合
- 标识 : 对象在内存中的地址
- 名字 : 设计中对象的别名, 可能和代码中名字一样, 也可能不一样.
-
一些对象模型中的数据会被重复
- 浪费了存储空间
- 对持续性的对所有对象更新造成了困难
-
冒号后面 : 类名
-
冒号前面 : 对象名, 可以为空
-
下划线 : 表示一个具体对象
-
有方向的箭头 ; 对象间的可到达性 (Navigability), 表示通过Part的对象可以到达/遍历到CatalogueEntry的对象
-
私有属性里的指针 表示 UML图中的 Navigability
- Message Passing : 箭头上面是消息传递区域
- cost : 消息名字
- () : 需要传递的参数
- 0.02:= : 返回的信息
例子
- 一个部件包含有三个零件, 这三个零件分别属于两个类
- 一个部件包含一个零件和一个更小的部件, 更小的部件包含两个零件, 这些零件属于两个类
- 存在的问题
- contains 通过指针实现, 但是这个指针的类型不确定, 因为代码中无法同时指向Part和Assembly
- 解决办法
- 引入一个新的基类Component, 既可以是Part也可以是Assembly
- 引入一个新的基类Component, 既可以是Part也可以是Assembly
- * : 一个Assembly 对应任意个Component
- 0…1 : 一个Component 对应一个或者零个Assembly
- 0 : 一个单独的Part不属于任何Assembly
- 1 : 一个属于Assembly的Part
- 上面的contains 使用一个 Component的指针即可
-
多态性 : 同样的Component类的对象, Part接收到Cost消息后是发送getCost, Assembly接收到Cost消息后是转发Cost
-
类图
- 对象图: 只能描述程序可能状态里的一小部分
- 类图是从一个更加抽象的层面描述软件系统
- 和对象图类似
- 显示了属性的类别
- 继承
- 关联
- 类名下没有下划线
- 属性前的小锁表示私有属性
- 属性后的为数据类型
面向对象程序的优势
- 对象封装了数据和操作
- 对真实世界进行了建模, 真实世界的对象+事件 映射成了 对象+消息