依赖、关联、聚合、组合还有泛化的关系

by Administrator 2010.9.7 06:07
世界是普遍联系的,因此程序世界中的类,也不可能是孤立的。UML为我们定义了它们之间的关系,就是:依赖、关联、聚合、组合还有泛化。       泛化关系比较好理解,就是表示类之间的继承关系。容易混淆的是依赖、关联、聚合和组合的关系。这里做一些甄别:        1、 依赖和关联的颠倒颠       在网上查找了一下依赖和关联的区别,有说“关联本身即是一种依赖”,亦有说“依赖是一种弱关联”,其实说来说去是一档子事。依赖和关联都是说一个类用到了另一个类。其区别在于一个是使用,一个是拥有。      依赖:具有某种偶然性。比如说我要过河,没有桥怎么办,我就去借来一条小船渡过去。我与小船的关系仅仅是使用(借用)的关系。表现在代码上,为依赖的类的某个方法以被依赖的类作为其参数。或者是class A 的某个方法创造了 class B 的实例抑或对class B的静态方法的调用。如果A依赖于B,那意味着B的变化可能要求A也发生变化;       这是uml图表示的依赖关系:       代码表现: 1public class Person{    2    /** 划船 */   3    public void oarage (Boat boat){    4        boat.oarage();    5 }    6} 7 关联:有名的客户和订单的关系以及公司和员工的关系,都是关联关系。还有就是我和我的单车的例子,他们都是一种“拥有”的关系。表现在代码上,就是一个类包含另一个类的实例,通常表现为被关联类以类属性的形式出现在关联类的类定义中,也可以表现为关联类引用了一个类型为被关联类的全局变量。关联可以使单向的,也可以使双向的。从网上找到的公司和员工的UML图和代码 :公司和员工的关联关系  1public class Company{     2    private Employee employee;     3    public Employee getEmployee(){     4        return employee;     5    }     6    public void setEmployee(Employee employee){     7        this.employee=employee;     8    }     9    //公司运作    10    public void run(){    11        employee.startWorking();    12    }    13} 14可见依赖于与关联亦有动静之别,关联的类“静态”地引用了被关联类的实例变量,而依赖的偶然性也正说明了它的动态性。      2、 聚合与组合同出而异体      聚合与组合其实都是关联的特例,都是整体和部分的关系。他们的区别在于聚合的两个对象之间是可分离的,他们具有各自的生命周期。而组合往往表现为一种唇齿相依的关系。聚合:一种容纳或曰包含的关系,如同机场和飞机,汽车和轮胎的关系。其实仔细想想,前面的公司和员工的关系也有聚合的味道在里面。组合:也可称之为强聚合,整体和部分是不可分的,整体的生命周期结束时也就是部分的生命周期到头时。很有名的就是桌子和桌子腿的关系。      聚合的UML图:组合的UML图: 然而,聚合与组合的代码表现形式是一样的,都可以表现为以下的形式,它们仅仅具有语义上的区别。网上找到的电脑和CPU的关系的代码表现: 1public class Computer{     2    private CPU cpu;     3    public CPU getCPU(){     4        return cpu;     5    }     6    public void setCPU(CPU cpu){     7        this.cpu=cpu;     8    }     9    //开启电脑    10    public void start(){    11        //cpu运作    12        cpu.run();    13    }    14}  15依赖和关联都是说一个类用到了另一个类。其区别在于一个是使用,一个是拥有。//公司运作 10 public void run(){ 11 employee.startWorking(); 12 }这里说的“使用”更多的体现一个临时。而“拥有”更多体现为一个长期拥有。关系类图如下:以下为实际例子:  

Tags:

C/C++

组合,关联,聚合的区别

by Administrator 2010.9.7 04:13
在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在UML类图中,关系用类框之间的连线来表示,连线上和连线端头处的不同修饰符表示不同的关系。类之间的关系有继承(泛化)、关联、聚合和组合。(1)继承:指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。类图中继承的表示方法是从子类拉出一条闭合的、单键头(或三角形)的实线指向基类。例如,图3.2给出了MFC中 CObject类和菜单类CMenu的继承关系。     图3.2 类的继承类的继承在C++中呈现为:class B { } class A : public B{ }(2)关联:指的是模型元素之间的一种语义联系,是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联,角色可以具有多重性,表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束,以加强关联的含义。  关联在C++中呈现为:class A{...} class B{ ...} A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)即一个类作为另一个类方法的参数。(3)聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。 (4)组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。我们用浅显的例子来说明聚合和组合的区别。“国破家亡”,国灭了,家自然也没有了,“国”和“家”显然也是组合关系。而相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独立存在,还可以接在别的计算机上。在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享,比如打印机就可以在办公室内被广大同事共用。在C++语言中,从实现的角度讲,聚合可以表示为:class A {...} class B { A* a; .....}即类B包含类A的指针;而组合可表示为:class A{...} class B{ A a; ...}即类B包含类A的对象。准确的UML类图中用空心和实心菱形对聚合和组合进行了区分。          图3.4 聚合和组合 聚合,关联,组合 是对象之间的三种关系。从某种意义上说,继承是一种类的纵向关系,而聚合,关联,组合是对象的横向关系。其关系强弱为 关联<聚合<组合 关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。我想举个通俗的例子。你和你的心脏之间是composition关系(心脏只属于自己)你和你买的书之间是aggregation关系(书可能是别人的)你和你的朋友之间是association关系聚合与组合的区别:聚合∶分散的聚集到一起 组合∶几个独立部分组成的整体 由上可见,聚合就像将不同的水果放到一个玻璃果盘里,玻璃果盘摔坏,并不影响水果。

Tags:

C/C++

键盘Key值

by Administrator 2010.6.5 04:08
键盘Key值:......vbKeyLButton 0x1 鼠标左键 vbKeyRButton 0x2 鼠标右键 vbKeyCancel 0x3 CANCEL键 vbKeyMButton 0x4 鼠标中键 vbKeyBack 0x8 退格键 vbKeyTab 0x9 TAB 键 vbKeyClear 0xC CLEAR健 vbKeyReturn 0xD 回车键 vbKeyShift 0x10 SHIFT 键 vbKeyControl 0x11 CTRL 键 vbKeyMenu 0x12 MENU 键 vbKeyPause 0x13 PAUSE 键 vbKeyCapital 0x14 APS LOCK 键 vbKeyEscape 0x1B ESC 键 vbKeySpace 0x20 空格键 vbKeyPageUp 0x21 Page Up 键 vbKeyPageDown 0x22 Page Down 键 vbKeyEnd 0x23 END 键 vbKeyHome 0x24 HOME 键 vbKeyLeft 0x25 光标左键 vbKeyUp 0x26 光标上键 vbKeyRight 0x27 光标右键 vbKeyDown 0x28 光标下键 vbKeySelect 0x29 SELECT 键 vbKeyPrint 0x2A Print Screen 键 vbKeyExecute 0x2B EXECUTE 键 vbKeySnapshot 0x2C SnapShot 键 vbKeyInsert 0x2D INSERT 键 vbKeyDelete 0x2E DELETE 键 vbKeyHelp 0x2F HELP 键 vbKeyNumlock 0x90 NUM LOCK 键 vbKeyA 65 字母 A 键 vbKeyB 66 字母 B 键 vbKeyC 67 字母 C 键 vbKeyD 68 字母 D 键 vbKeyE 69 字母 E 键 vbKeyF 70 字母 F 键 vbKeyG 71 字母 G 键 vbKeyH 72 字母 H 键 vbKeyI 73 字母 I 键 vbKeyJ 74 字母 J 键 vbKeyK 75 字母 K 键 vbKeyL 76 字母 L 键 vbKeyM 77 字母 M 键 vbKeyN 78 字母 N 键 vbKeyO 79 字母 O 键 vbKeyP 80 字母 P 键 vbKeyQ 81 字母 Q 键 vbKeyR 82 字母 R 键 vbKeyS 83 字母 S 键 vbKeyT 84 字母 T 键 vbKeyU 85 字母 U 键 vbKeyV 86 字母 V 键 vbKeyW 87 字母 W 键 vbKeyX 88 字母 X 键 vbKeyY 89 字母 Y 键 vbKeyZ 90 字母 Z 键 vbKey0 48 数字 0 键 vbKey1 49 数字 1 键 vbKey2 50 数字 2 键 vbKey3 51 数字 3 键 vbKey4 52 数字 4 键 vbKey5 53 数字 5 键 vbKey6 54 数字 6 键 vbKey7 55 数字 7 键 vbKey8 56 数字 8 键 vbKey9 57 数字 9 键 vbKeyF1 0x70 F1 功能键 vbKeyF2 0x71 F2 功能键 vbKeyF3 0x72 F3 功能键 vbKeyF4 0x73 F4 功能键 vbKeyF5 0x74 F5 功能键 vbKeyF6 0x75 F6 功能键 vbKeyF7 0x76 F7 功能键 vbKeyF8 0x77 F8 功能键 vbKeyF9 0x78 F9 功能键 vbKeyF10 0x79 F10 功能键 vbKeyF11 0x7A F11 功能键 vbKeyF12 0x7B F12 功能键 vbKeyF13 0x7C F13 功能键 vbKeyF14 0x7D F14 功能键 vbKeyF15 0x7E F15 功能键 vbKeyF16 0x7F F16 功能键 vbKeyNumpad0 0x60 小键盘 0 键 vbKeyNumpad1 0x61 小键盘 1 键 vbKeyNumpad2 0x62 小键盘 2 键 vbKeyNumpad3 0x63 小键盘 3 键 vbKeyNumpad4 0x64 小键盘 4 键 vbKeyNumpad5 0x65 小键盘 5 键 vbKeyNumpad6 0x66 小键盘 6 键 vbKeyNumpad7 0x67 小键盘 7 键 vbKeyNumpad8 0x68 小键盘 8 键 vbKeyNumpad9 0x69 小键盘 9 键 vbKeyMultiply 0x6A 小键盘 * 键 vbKeyAdd 0x6B 小键盘 + 键 vbKeySeparator 0x6C 小键盘回车键 vbKeySubtract 0x6D 小键盘 - 键 vbKeyDecimal 0x6E 小键盘 . 键 vbKeyDivide 0x6F 小键盘 / 键  

Tags:

C/C++

关于博主

      什么都懂一点儿,热衷技术,热爱Programming,每有难题,常夜以继日,每有解决方案,手舞足蹈而欣喜若狂;好读书,不求甚解;每有会意,便欣然忘食;常纵情于山水之间,忘乎于尘世之外,唯程序难释怀尔。
       QQ:51557288

归档

最近的评论

声明

本博所有网友评论不代表本博立场,版权归其作者所有。

© Copyright 2011