收藏 分享(赏)

华南理工大学UML—6.类图中的一些高级属性.ppt

上传人:hwpkd79526 文档编号:4360067 上传时间:2018-12-25 格式:PPT 页数:62 大小:554.50KB
下载 相关 举报
华南理工大学UML—6.类图中的一些高级属性.ppt_第1页
第1页 / 共62页
华南理工大学UML—6.类图中的一些高级属性.ppt_第2页
第2页 / 共62页
华南理工大学UML—6.类图中的一些高级属性.ppt_第3页
第3页 / 共62页
华南理工大学UML—6.类图中的一些高级属性.ppt_第4页
第4页 / 共62页
华南理工大学UML—6.类图中的一些高级属性.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、1,软件需求分析与建模 -补充:接口、抽象类和各种关联,姓名:苏锦钿 ( SuJD ) 单位:计算机科学与工程学院 时间:2018年12月25日,2,补充:接口、抽象类和各种关联,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,3,抽象类,抽象类是指那些不具有任何对象的类,其作用是为其他的类描述它们的公共属性和行为。(例如Vehicle) 通常,抽象类具有一组抽象操作。一个拥有至少一个抽象操作的类必定是一个抽象类。 UML采用斜体表示抽象元素的名称;如果不用斜体字,也可使用abstract约束来表示。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,4,接口,一个类和一

2、个接口不同:一个类可以有它形态的真实实例,然而一个接口必须至少有一个类来实现它。在 UML 2 中,一个接口被认为是类建模元素的特殊化。因此,接口就象类那样绘制,但是长方形的顶部区域也有文本“interface”,如下图所示。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,5,常量接口,接口一般用来表示一组行为,但有时候也会用来表示静态数据,称为常量接口。Java语言中的ObjectStreamConstants、Zipconstants和DnDConstants就是常量接口。(不建议使用这种方法),华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,6,Java语言中的

3、标识接口,标识接口是指没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,仅表明实现它的类有一个特定的类型。比如Java语言中的java.io.Serializable和java.rmi.Remote等。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,7,VI 接口和抽象类,接口是一个不带实现的类,它只规定类的外部特性,包括公共属性、操作及其语义,因此只有操作声明而没有方法体和物理存储区。 抽象类和接口很相似,也只定义接口而推迟定义其实现部分,然而抽象类允许增加一些方法的实现。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,8,接口和抽象类(续),抽

4、象类允许增加一些方法的实现,但接口必须推迟定义所有的方法。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,9,接口和抽象类的主要区别,抽象类是一种类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象。而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,10,abstract class和interface之间在对于抽象类定义的支持方面具有很

5、大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。 其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,11,abstract class和interface在Java语言中都是用来进行抽象类定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢? 在面向对象技术中,所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来

6、描绘一个具体的对象,这样的类就是抽象类。 抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,12,比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。 正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,13,语法层面的区

7、别,在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。 使用abstract class的方式定义Demo抽象类的方式如下: abstract class Demo abstract void method1(); abstract void method2(); ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,14,使用interface的方式定义Demo抽象类的方式如下: interface Demo void method1(); void method2(); ,华 南

8、理 工 大 学,面 向 对 象 分 析 与 设 计,15,在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法。 而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是final static的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。 从某种意义上说,interface是一种特殊形式的abstract class。 从编程的角度来看,abstract class和interface都可以用来实现“design by contract“的思想。但是在具体的使用

9、上面还是有一些区别的。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,16,首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,17

10、,设计理念层面上的区别,abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在“is a”关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,18,实例,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义

11、一个表示该抽象概念的类型,定义方式分别如下所示: 使用abstract class方式定义Door: abstract class Door abstract void open(); abstract void close(); ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,19,使用interface方式定义Door: interface Door void open(); void close(); ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,20,其他具体的Door类型可以extends使用abstract class方式定义的Door或者implem

12、ents使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。 如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢?,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,21,解决方案一: 简单的在Door的定义中增加一个alarm方法,如下: abstract class Door abstract void open(); abstract void close(); abstract void alarm(); ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,22,或者: int

13、erface Door void open(); void close(); void alarm(); ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,23,那么具有报警功能的AlarmDoor的定义方式如下: class AlarmDoor extends Door void open() void close() void alarm() 或者 class AlarmDoor implements Door void open() void close() void alarm() ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,24,解决方案二: 既然ope

14、n、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有: (1)这两个概念都使用abstract class方式定义; (2)两个概念都使用interface方式定义; (3)一个概念使用abstract class方式定义,另一个概念使用interface方式定义。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,25,AlarmDoor在概念本质上是Door,同时它有具有报警的功能。因此, 对于Door这个概念,我们应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完

15、成报警概念中定义的行为,所以报警概念可以通过interface方式定义。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,26,如下所示: abstract class Door abstract void open(); abstract void close(); interface Alarm void alarm(); class AlarmDoor extends Door implements Alarm void open() void close() void alarm() ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,27,您是否碰到过以下问题:

16、 1、接口不实现方法,但在程序中可以调用接口的方法,这是为什么? 比如 java.sql 包中的 Connection、Statement、ResultSet 等都是接口,怎么可以调用 它们的方法呢? 2、抽象类不能实例化,但是jdk中却有很多抽象类的对象,这是为什么? 比如 System.in 是一个 InputStream 类型对象,但 InputStream 是抽象类,怎么可以得到它的对象呢?,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,28,不管是抽象类中的抽象方法,还是接口中定义的方法,都是需要被调用的,否则这些方法定义出来就没有意义了。要注意: 一个子类如果继承了它

17、的基类,则表示这个类也是其基类的一种类型,这个子类的一个对象是子类类型,并且同时也是其基类的一个对象,它也具有基其类的类型;一个类如果实现了一个接口,则表示这个类的一个对象也是这个接口的一个对象。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,29,例如: 如果“人”是一个基类,则“男人”是“人”的一个子类。如果“张三”是一个“男人”,也就是说“张三”是“男人”的一个对象,那么显然“张三”也是“人”这个基类的一个对象。同样的,如果“客户”是一个基类,“VIP客户”是“客户”的一个子类。如果“李四”是VIP客户,那么它也是客户的一个对象。,华 南 理 工 大 学,面 向 对 象 分

18、 析 与 设 计,30,因此,我们得到的抽象类的对象其实是它的已经实现了抽象方法的子类或子孙类的一个对象,但我们拿它当它的抽象类的基类来用。 例如jdk 的抽象类 java.lang.Process : Runtime runtime = Rumtime.getRuntime(); Process process = rumtime.exec(“notepad.exe“); Class cls = process.getClass(); System.out.println(cls.getName();,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,31,这时会打印出 proce

19、ss 类的名字,如果在 Windows 下它会是一个类似于 *Win32* 的名字,它是 Process 的一个子类。 因为 process 类用于管理打开的进程,而在不同的操作系统上都有不同的实现,因此它把方法定义为 Process 的抽象方法,而具体的操作只能由对应在不同操作系统下的子实现。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,32,对接口来说,其原理也是一样,接口是一个规范,规定了实现接口的类必须具备的能力(也就是方法)。 例如,某种类型的驾驶执照,要拿到这个驾照的人必须能够“开小汽车”和“开公共汽车”。那么可认为这个驾照是一个接口。 可定义类 Driver,继承

20、自 Human,然后实现“驾照持有者”这个接口: public interface DriverHolder public void driverCar(); public void driverBus(); public class Driver extends Human implements DriverHolder public void driverCar() / public void driverBus() / ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,33,这样一来,一个“Driver”对象,它同时也是一个 DrivreHolder 对象。即一个司机(Dri

21、ver)同时是一个驾照执持有者对象。在程序中我们可以这样: DriverHolder driverholder = new Driver(); driverholder.driverCar();,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,34,为什么要定义一个接口呢? 为什么不直接把这个方法定义到 Driver 类中去,然后 Driver driver = new Driver(); 一样可以调用它的 driverCar(); 和 driverBus() 方法,这样做岂不是方便得多?,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,35,下面我们看一看 java

22、的事件机制。 java.awt.Button 类有一个 addActionListener(ActionListener l);方法。 该方法传入的是接口类型:ActionListerner,在实际中,需要实现 ActionListener 接口,并把实现这个接口的类的对象引用作为参数传入。 这样,Button对象就得到了一个 ActionListener 对象,它知道这个 ActionListener 对象有一个 actionPerformed 方法,或者说它有处理 Action 事件的能力,当 Action 事件发生时,它就可以调用这个对象的 actionPerformed 方法。,华 南

23、 理 工 大 学,面 向 对 象 分 析 与 设 计,36,比如一般我们会这样做: public class TestButton extends Frame implements ActionListener private Button btn1 = new Button(); / public TestButton() btn.addActionListener(this); this.add(btn); public void actionPerformed(ActionEvent e) ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,37,假设 ActionListen

24、er 不是接口,而是一个类。那会出现什么样的情况?,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,38,那么我们只能继承 ActionListener 类,并且重写 actionPerformed 方法。但是java是单继承的,如果类继承了 ActionListener 类,那么它就不能继承其它的类(Frame 类)了,而不从 Frame 类继承的话,又怎么创建窗体,怎么把 Button 放到窗体中去呢?,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,39,其实接口不完全是为了解决 java 的单继承问题,它在某种程度上可以达到调用和实现细节的分离。 例如,在 Bu

25、tton 的事件机制中,Button 要保证所有的action 事件发生时,程序员都可以在代码中处理它。而接口就可以做到这一点:找一个类实现 ActionListener 接口,并让 Button 得到该类的对象的引用( 调用 addActionListener 方法)。 当Action事件发生时,button 创建一个包含了事件信息的对象(ActionEvent),然后调用这个接口对象的方法。至于如何处理这次事件,这就是实现接口的类的事情了。在这里,Button 丝毫不了解 actionPerformed 方法中到底干了什么事情,也不应该知道。Button 与具体的业务逻辑完全分离开了,它可

26、以应用到所有的场合。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,40,在系统的设计过程中,顶层的元素是用接口好,还是用抽象类好呢?如果是用接口好的话,那么当接口中部分方法是实现该接口的类所不需要的,怎么办呢?,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,41,契约式编程,先看下面一段代码: public class RationalNumber private int numberator; private int denominator; public RationalNumber(int numberator, int denominator) this.

27、numberator = numberator; this.denominator = denominator; 上述代码表示一个在 32 位有符号整型范围内的有理数。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,42,有理数的分母不能为 0 。所以,上述代需要改为: public class RationalNumber private int numberator; private int denominator; public RationalNumber(int numberator, int denominator) if (denominator = 0) thro

28、w new ArgumentException(“The second argument can not be zero.“); this.numberator = numberator; this.denominator = denominator; ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,43,使用契约式编程,public class RationalNumber private int numberator; private int denominator; public RationalNumber(int numberator, int denominator)

29、 Contract.Requires(denominator != 0, “can not be zero.“); this.numberator = numberator; this.denominator = denominator; public int Denominator get Contract.Ensures(Contract.Result() != 0); return this.denominator; ContractInvariantMethod protected void ObjectInvariant() Contract.Invariant(this.denom

30、inator != 0); ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,44,C+里面有没有契约式编程思想?如果存在的话,你平时会经常使用吗?,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,45,是否碰到过下面类似的代码: #ifdef CONTRACT_FULL ASSERT(denominator != 0); CheckInvaraint(*this); #endif this.numberator = numberator; this.denominator = denominator; #ifdef CONTRACT_FULL CheckInvarai

31、nt(*this); #endif ,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,46,契约式编程不是一门崭新的编程方法论。在C/C+ 时代已经存在。但并未应用广泛,主要原因包括: 1.C+中经常包括大量的宏和条件编译,因此给代码的可读性等造成很多麻烦。 2.契约式编程在 C+ 世界并未被标准化,因此项目之间的定义和修改各不一样,给代码造成很大混乱。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,47,.NET 4.0 中正式引入契约式编程库。实际上,.NET 4.0 仅仅是针对 C+ 宏和条件编译的再次抽象和封装。 它完全基于 CONTRACTS_FULL, C

32、ONTRACTS_PRECONDITIONS Symbol 和 System.Diagnostics.Debug.Assert 方法、System.Environment.FastFail 方法的封装。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,48,契约式编程,契约是减少大型项目成本的突破性技术。它一般由 Precondition(前置条件), Postcondition(后置条件) 和 Invariant(不变量) 等概念组成。 .NET 4.0 除上述概念之外,还增加了 Assert(断言),Assume(假设) 概念。 契约的思想很简单。它只是一组结果为真的表达式。如

33、若不然,契约就被违反。那按照定义,程序中就存在纰漏。契约构成了程序规格说明的一部分。 将契约挪移到代码中,就使得程序可以被验证。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,49,契约式编程Design by Contract,Design by Contract(DBC)大概可以译为“按契约设计”,是由Bertrand Meyer首先正式提出并在Eiffel语言中实现的编程方法学。 有两个敌对的学派,分别叫做: (1)Defensive Programming(创始人Barbara Liskov) (2)Design by Contract(创始人Bertrand Meyer

34、) 前者认为在每一个函数中需要加入尽可能多的条件检查,以确保这个函数是正常工作的。后者认为,需要为每一个函数精确指明调用者(Client 客户端)需要满足的条件,以及函数的实现本身(Contractor )需要满足的条件,就可以了。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,50,契约式设计,契约式设计(Design by Contract)(DBC) 是面向对象的软件设计中的一种技术,它的目的是保证软件质量、可靠性和可重用性。DBC 中的关键考虑是可以通过以下做法实现这个目标: (1)尽可能准确地规定组件之间的通信。 (2)定义通信过程中的相互责任和预期的结果。 这些相互责

35、任称为 契约,用 断言检查应用程序是否满足契约。 简单地说,断言是插入到程序执行中的特定点的布尔表达式,它必须为真。失败的断言通常是软件 bug 的症兆,所以必须将它报告给使用者。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,51,断言和 Java 语言,DBC 识别三种基本的断言类型: (1)前置条件: 客户为了正确调用外部组件而必须满足的责任。 (2)后置条件: 执行外部组件后的预期结果。 (3)不变量: 在执行了外部组件后维持不变的条件。 Java 语言原来没有提供对断言的天然支持。 assert 语句是在版本 1.4 中加入的。,华 南 理 工 大 学,面 向 对 象

36、分 析 与 设 计,52,契约式设计流程:,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,53,其他的各种关联,1.限定关联 2.关联类 3.双向关联 4.单向关联 5.递归关联,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,54,限定关联,限定关联是一对多或多对多关联的另一种表示,它通过添加限定符来标识在这个关联的一方出现的多个对象中的每一个对象。注意:限定符是关联线的一个附加信息,而不是类的。,例如,紧贴关联目录类一端的小矩形是一个限定符,它限定目录对象使用文件名来标识属于它的每一个文件。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,55,关联类

37、,关联类不仅有名称、有相关对象的角色以及参与这些角色的对象数量(多重性),而且还有属性(如工作时间)、操作以及其他一些特性。,公司,* 雇主,01,人,使用关联类时,在任何两个相关的对象之间只能存在关联类的一个实例。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,56,关联类,在关联建模中,在一些情况下需要包括其它类,因为它包含了关于关联的有价值的信息。对于这种情况,可使用 关联类 来绑定你的基本关联。关联类和一般类一样表示。不同的是,主类和关联类之间用一条相交的点线连接。如下图所示。,关联类就像一个标准的类,可以用属性,操作以及与其他关联。其作用是为一个链接添加一些附加信息。,

38、华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,57,双向(标准)的关联,关联是两个类间的联接。关联总是被假定是双向的;这意味着,两个类彼此知道它们间的联系,除非限定一些其它类型的关联。下图 显示了在Flight类和Plane类之间的一个标准类型的关联。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,58,单向关联,一个单向关联中,两个类是相关的,但是只有一个类知道这种联系的存在。下图 显示单向关联的透支财务报告的一个实例。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,59,一个单向的关联,表示为一条带有指向已知类的开放箭头(不关闭的箭头或三角形,用于

39、标志继承)的实线。如同标准关联,单向关联包括一个角色名和一个多重值描述,但是与标准的双向关联不同的时,单向关联只包含已知类的角色名和多重值描述。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,60,反射关联 (递归关联),类也可以使用反射关联与它本身相关联。当一个类关联到它本身时,这并不意味着类的实例与它本身相关,而是类的一个实例与类的另一个实例相关。,右图描绘的关系说明一个Employee实例可能是另外一个Employee实例的经理。然而,因为“manages”的关系角色有 0*的多重性描述;一个雇员可能不受任何其他雇员管理。,华 南 理 工 大 学,面 向 对 象 分 析 与 设 计,61,关联可以有一些角色,这些角色与该关联涉及的每个类相连。角色名称属于关联部分,而不属于类的部分。,62,Click to edit company slogan .,,问题?,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报