结构化的表达,客观事物的术语 第一类也是最重要的一类,就是类和对象
它实际上体现了有数据抽象的这样的一个原则 那在这个术语中,类
是具有相同属性、 操作、 关系和语义的对象的描述
那么对象呢,是大千世界中的基本的组成单位,对吧? 它实际上是类的一个实例。
那么从表示上面,UML 里面给出了这样的一个表示法,既然已经知道了,说类是具有相同属性的
和相同操作的一组对象的、 这样的一个高度抽象,实际上它是什么?
一组对象的集合,对吧?那这个类要描述的话,首先要给出类名来
另一个最重要的就是,这个类的属性啊就说是 那么另一个就是类的操作。
那么类的这个属性是表明了这个对象的 静态的这样的一些这个比如说状态啊,等等这样的一些特征
那么操作呢,表明了这个对象的行为的特征,所以
具有相同属性和相同操作的这组的对象,它们的属性和操作是一样的啊
那么在这个,这是一个比较规范的这样 的一个描述,有的时候我还可以简化地去描述。
如果这个 这个类啊相当于,如果前面相当于它还有 N
多的 这个包的话,有的时候我还要在前面给出一个包的这名。
实际上就是说 这是一个限定名,表明了我这个类是列属于哪个包中的类
所以大家看,类主要就是分为这么 两大种的这样的一个描述啊。
所以也可以看到类里面最重要的就是什么? 属性和操作这两栏。
那 还需要强调一点就是,类可以是抽象类啊,就是它可以没有实例
这个时候,我们的类名给出来的是斜体字
那么大家可以看到整个这个斜体字的这样的一个类,整个就是说,它是没有具体实例的这样一类 在因为在
C++ 等等的这样一些面向对象的语言中,经常会用到
那么这里面还需要说一下,就是在命名的机制,无论是类名 属性名和操作名,都有它独特的命名机制。
比如说类名 UML 里规定用黑体字,第一个字母通常要大写
并且位于第一栏的中央,非,规定的非常得细致。
那么类名呢 往往是从被建模系统的词汇表中相当于,一些作为简单的一些名词啊,或者名词短语中去抽象
我们后面会带领大家来看一下,怎么去抽象,从大千世界中的这些事物去抽象类
那么属性,我们来看一下,属性是类的一个静态特征,对吧?
它也是命名的一个特征,因为你给了一个属性名嘛,比如说,这个 Wall这是一个墙,对吧?墙给了高
宽、 厚度,对吧,以及是不是承重墙 所以大家看,这是对于一个墙这类事物的这样的一个静态属性的这个描述
所以,对于这里面的这些静态的这个属性,都是一个命名的这样的一个特性
那么它表明了这个,类所
给出来的这些对象啊,所包含的这些对象的一些静态的状态
那么还有一点就是说,大家可以看,一个属性有的时候
可以具有就是这个类型,同时呢相当于要给出一些取值的这样的一个范围的描述
有的时候呢,类的一个对象,每个属性呢我还给出一个特定的值
但是想说的就是,一个类可以有多个属性,也可以没有属性,我只有操作。
所以这样的类也是可以的 那么这个属性又分为两大类了:一个
就是实例范围的属性,一个是类范围的属性。
什么叫实例范围的属性呢? 就是一个类的所有的对象具有相同的属性
这个属性的个数啊、 名称啊、
数据类 型相同,属性值是不同的,对吧?这个我们大家能理解
那么因为这个对象的状态,它可能随着程序的执行是不一样的。
但是类范围 的属性是指这个类所容扩的,或者所包含的所有的对象
它们的这个对象实例啊、 属性值是完全相同的,所以就不止是一个 这个个数啊、
名称、 类型相同,属性值都相同,也就是说一直是不变的,从头到尾都是不变的 所以大家看
C++ 里面,就是标志为 static 的这样的一个成员变量,它就是类属性
那么这是属性的这样一个命名的格式 比如说分为可见性、
属性名、 类型、 多重性 那在后面相当于如果也可以给出属性的初始值。
还有有的时候会 加一些特性串来描述这个属性一些固有的一些特性
所以这里面大家看,可见性里面描述什么呢?比如说 表明这个属性是否被其他类所使用啊,这个
可见性可以分为这四种,一个是公有的,对吧?可以被其他类所使用 那么
* 表示受保护的,其他子类可以使用它。
那还有的 这个私有的这样的一种类型,就是本类的操作才能使用它
那这个呢符号表明是包内的,就是在同一个包中声名的类才能使用它 那有的时候,我们可以用关键字
public、 protected private、 package
等等,来代替这四种 可见性的标志词啊。
那另一个就是说属性名 属性名它表明了一个属性的这样的一个名词的字符串啊
这个它有这个小写字母开头,左对齐这样的一个特点 类型,对吧?属性名相当于会有这个,比如说
name 是属性名,那 string 是它的这个属性的这个类型
多重性呢用于表达属性值的这个数目,比如说 points 2
到这个多啊,相当于这个 point 相当于是,这个相当于就表明了这个 多重性。
那在这个多重性的表示里面,有的时候我们也可以省略,省略的时候,就表明一到一 但有的时候,大家切记啊,因为在前几
轮的课中,有的同学学完这个的时候,就用这个多重性了 一看到这个
0 到 1 的时候说,奥,就有一个 就有一个,那你知道这个
0 表明什么? 表明我没有这个属性值,对吧?所以这个是一个空值,所以大家一定要记住
当你没有的时候,表明了我只有一个属性值。
那在这个里面表明的是,我还允许你是空 这样的一类特殊的东西。
那下面再说一下初始值啊,就是说这个 属性呢,有的时候会给出一个初始值。
一般情况下,是要跟语言相关的这样一个表达式 比如说,origin,对吧?point,括号,对吧?0,0
我这个就相当于,这个点就是 (0, 0) 这个点开始,这就是一个初始值 所以初始值是可选的。
我可以这个属性最开始的时候,就不设任何的初始值 另一个说到性质串,性质串呢,它实际上是
表达这个属性所具有的一些性质来给出来的。
比如说举一个简单例子你就能懂了 这个 a 是一个属性,对吧?是一个。
那么这个呢,是 属性的这样一个类型,是一个整型,对吧?那么等于
1 后面是 frozen,大家看我花括号里面给出来这个 frozen,这就是性质串
这个性质串表明了什么?这个属性是不可以改变的 就这个属性属性值一直是不变的,所以
你要一看到这个说,我已经被什么?被冻住了,对吧?被 固化了,所以你就很容易来知道说,这样的一个属性,它的一些特点
那么这就是一个属 性的声明举例。
最简单的就是给一个 origin 就可以了 那么有的时候,我在属性前面又加了可见性怎么描述?
那么又给出来了属性的这样的一个类型的描述啊,那么同时相当于我又给出来了属性的
多重性的这样的描述,对吧?在这个里面又给出了属性的初始值的这样的一个描述,在后面相- 当于又给出了一个
这个性质串,比如说在这个里面我给了一个 id,对吧?Read Only
你只读 所以你这一看就知道说,这个属性的特点是不能够写的,不能被写的
那下面讲类里面的另一个非常重要的,也就说这个类
所囊括那些对象它具有的一些行为的特点,就是它体现得对外的服务啊
它能为别人去提供什么样的服务呢?就是说它要实现的操作 这个操作是一个类中所有对象要做的事情的这个抽象
所以大家看,这是一个矩形,这个矩形这个类呢,我里面抽取出来这四个操作
有加,有这个相当于增长、 移动,对吧?是不是空
所以这样的一个表示,就能够把这个矩形能够做的这样一些事情都给它抽象出来了
那么一个类可以有多个操作,也可以没有操作,大家一定记住 就像一个类可以有一个属性,也可以没有属性,对吧?
那么操作名除第一个词之外,其他每个词的第一个字母要大写
那还要一个操作名往往是描述其所在的类的行为的这个动词和动词短语
这个里面呢有的时候也可以根据,就是给出这个操作的特征进一步来描述它
所以这个里面大家可以看到,就是说有的时候会给出一些这个操作的类型
就是参数和这个相当于它的返回值类型 操作是斜体的部分表明
是没有具体实现的操作。
所以这就是一个 类为什么称为抽象类呢?它里面一定暗含着什么
没有实现的操作,所以大家可以看到,比如说 这个
Window 斜体,这个 display 和 hide 这两个操作都是斜体 那么操作映射到
C++ 里面我们看到是纯虚操作,对吧?这个大家就能理解了
调一个对象的操作可能会改变这个对象的数据和状态 所以操作的这样的一个产生经常也会是看
是否你的属性需要变动,如果属性值需要 变动的话,经常可能为了改变属性值去增加相应的一些操作
所以有的操作体现了这个事物的一些固有的一些
这个行为特点,有的可能是为了实现它的一些静态特征之间的转换,对吧?
比如说一个对象它的状态之间的改变,那我可能要增加一些这样的操作来实现,帮助它实现
这个状态的改变。
那么 操作的作用范围也是分为类范围的操作和实例范围的操作,所以
区别就是大家看一下,类范围的操作在底下划了一个这个,划了一个相当于下划线
那跟我们大家想一想就是那个属性的 也是分为类范围的属性,对吧?和实例范围的属性,也是在
下面通过下划线的这样的一个区分度来表示出两者之间的区别 那我们再看一下
表示操作的完整的语法,就是也是分为可见性、 操作名
操作名后面相当于是操作的参数表,那么返回值和性质串
所以这个里面可见性跟属性是完全一样的,也分为这四类,我就不细讲了。
那么操作名呢 一般是动词和动词短语,就是左对齐,这个大家也,刚才也知道了
那么参数表我希望 来给大家介绍一下,也希望大家引起重视。
也就是如果你对一个操作的参数来给出它相应的描述的话
你要从这个参数的这个名字,参数的这个类型,包括默认值等 方面来给出相应的描述。
另一点,你也可以加入这个参数的方向的描述
那么这个方向的描述可以分为这三类,一个就是表面是一个输入参数 那么
out 呢是表明是输出参数 但有的同学说,老师,还有一个中间的对吧?
inout 感觉得到它是不伦不类的,那这个
它实际上也是一个输入参数,它是为了与调用者进行信息通讯,可能要对它进行修改的这- 一类参数
那么引入了这个 inout 是为了与传统的面向对象编程语言所实现的一些基本机制相
相这个吻合,所以这是要,它既然是想把所有的面向对象的这个
方法,对吧?集大成于一身,所以它就希望能囊括地尽可能的全面
所以这也是它为了兼顾以往的,很久远使用的一些传统的面向对象的编程语言所给出来的这- 样的一个 一个这个类型。
那么操作的这样的一个类型呢是这个实现
类型的这个语言相关的一些规约,它有一个默认值,这个里面我觉得大家有一个了解就可以了
那么在这个操作里面,除了这个参数表
同时我们还希望的是有的时候给出一些返回类型的描述,所以这里面大家要注意 一般的情况下,要对返回类型的描述
可能会与具体的实现语言有关,如果操作里没有返回值,比如说 C++ 里面就是
void 对吧? 就省略冒号和返回类型这样的一个描述。
如果 需要多个返回值的时候,可以用表达式的形式来足以给出
那么下一个要提到的就是操作的多态性 操作的多态性是什么含义呢?是指的,比如说
上面我们看这个图,上面的是什么?父类,下面的是子类 也就是说父类和子类之间的操作名相同,但是
里面的具体的处理逻辑是不一样的,或者它的 语义是不一样的,那大家看,比如说我这里面是
move 对吧? 那到这里面相当于是算法 1 ,这里面是算法 2 ,这表明我里面
整个的处理逻辑是不一样的,所以这种情况下就叫做操作的多态性