面向方面的实时系统开发方法郭东亮毕业论文最终稿.doc

上传人:laozhun 文档编号:3995177 上传时间:2023-03-30 格式:DOC 页数:71 大小:1.01MB
返回 下载 相关 举报
面向方面的实时系统开发方法郭东亮毕业论文最终稿.doc_第1页
第1页 / 共71页
面向方面的实时系统开发方法郭东亮毕业论文最终稿.doc_第2页
第2页 / 共71页
面向方面的实时系统开发方法郭东亮毕业论文最终稿.doc_第3页
第3页 / 共71页
面向方面的实时系统开发方法郭东亮毕业论文最终稿.doc_第4页
第4页 / 共71页
面向方面的实时系统开发方法郭东亮毕业论文最终稿.doc_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《面向方面的实时系统开发方法郭东亮毕业论文最终稿.doc》由会员分享,可在线阅读,更多相关《面向方面的实时系统开发方法郭东亮毕业论文最终稿.doc(71页珍藏版)》请在三一办公上搜索。

1、广东工业大学工学硕士学位论文面向方面的实时系统开发方法郭东亮二零零五年四月三十日分类号: 学校代码:11911UDC: 密级: 学 号:2110205159广东工业大学学位论文面向方面的实时系统开发方法郭东亮指 导 教 师: 张立臣 教授 广东工业大学计算机学院学 科 门 类: 工学 专 业 名 称: 计算机软件与理论 申请学位级别: 硕 士 论文提交日期: 2005 年 4 月 论文答辩日期: 2005 年 5 月 学位授予单位: 广东工业大学 摘要现代软件开发都要把整个系统按功能分解为小的单元,然后开发这些小单元,这些小的单元隐藏内部实现,对外提供接口,最后组合这些单元为整个系统,实现整个

2、系统的功能。但是系统中有的方面是横切整个系统的非功能关注点,无法很好地封装在单个模块中。如日志、性能问题、安全、上下文相关错误处理、QoS监测等等,这些方面分散在整个系统中,并且与系统的功能代码纠缠在一起,这样降低了模块的可追踪性、模块的可重用性、系统的可维护性等一系列问题,所以需要分离并模块化这些非功能关注点。面向方面编程在实现上分离和模块化横切关注点,面向方面建模在软件开发的其它阶段用一致的方法来详述、可视化、构造和文档化方面相关制品,这样在整个软件开发过程可以使用面向方面技术。实时系统是面向方面技术很好的应用场所,因为在实时系统中,有很多非功能需求,且这些非功能需求往往横切整个系统。在实

3、时系统中关键的就是时间要求了,这些时间要求散布在整个系统的功能部件里,带来了代码混乱和代码分散问题。本文分析介绍了AspectJ、组合过滤器、多维关注点分离和自适应编程等典型的分离关注点的方法。比较完整的介绍了面向方面建模领域的研究。阐述了实时系统中的主要实时需求,以及与实时系统有关的UML框架集。提出了一个新的扩展UML进行面向方面建模的方法,它以合适的语义表达了AspectJ和AspectC+的元素和织入机制。在这个方法中,方面继承自类,切入点和通知继承自特征,这样切入点和通知是方面的一部分,方面与基本类的关系用横切依赖表示。切入点的图符可以表达多个方面在相同连接点的横切行为,通知以一致的

4、方式建模结构横切和行为横切,通过在顺序图上新加一个通知发出焦点,并将通知表示为消息,这样可以清晰建模通知在何时何处怎样影响系统的行为。并分析了如何将这个方法应用于实时系统开发。关键词:面向方面编程;面向方面软件开发;实时系统;UMLAbstractUsing modern software development methodology, developers first decompose system into small units, which hide the internal implementation and provide only external interfaces,

5、then implement these units, at last compose these units to get a full system and realize required functions. But there are some non-functional concerns which crosscut whole system and cant be well encapsulated into a single module, such as logging, performance analysis, security, context related err

6、or handling, QoS monitoring, etc. These aspects are scattered and tangled in whole system, decreasing software traceability, reusability, adaptability. So these non-functional concerns should be separated and modularized.Aspect-Oriented Programming (AOP) separates and modularizes crosscutting concer

7、ns at implementation stage. Aspect-Oriented Modeling (AOM) specifies, visualizes, constructs and documents aspect related artifacts in a consistent way at other stage of software development. Thus whole software development process can use aspect-oriented technique.Real-time systems are well places

8、to apply aspect-oriented technique, for there are lots of non-functional requirements in real-time system, which scattering in whole system. The codes related with timing are mixed with other codes, resulting in code scattering and tangling.This article considers various techniques to separate cross

9、cutting concerns, namely AspectJ, AspectC+, Composition Filters, Hyperspace and Adaptive Programming; summarizes the researches in AOM domain; analyses real-time systems timing requirements and UML profiles for real-time systems.This article proposes a new technique to modeling aspect-oriented const

10、ructs and mechanisms by extending UML, which can represent constructs and weaving mechanism of AspectJ and AspectC+ with appropriate semantics. In this method, aspect is subclass of class; pointcut and advice are derived from feature, thus pointcut and advice are parts of aspect; relationship betwee

11、n aspects and base class is represented by special crosscut dependency. The notation of pointcut can express crosscutting behavior of many aspects at same join point. Advice can model structural crosscutting and behavior crosscutting in a uniform way. By adding a new block, advice sending focus, in

12、sequence diagram and regard advice as message, this method can clearly model where and when and how advices affect system behavior. The article also examines how this technique can be practiced in real-time systems development.Keywords: AOP;AOSD;real-time systems;UML目录摘要IAbstractII目录VContentsVII第一章

13、绪论11.1 研究背景11.2研究意义21.3面向方面技术在实时系统中的应用31.4 研究内容4第二章 分离关注点的方法52.1 AspectJ52.2 AspectC+72.3 组合过滤器82.4 Hyperspace132.4.1 多维关注点分离132.4.2 Hyperspace152.4.3 Hyper/J162.5自适应编程17第三章 实时系统软件设计213.1 实时系统概念213.2 实时需求213.3 实时UML扩展233.3.1 通用资源建模253.3.2 通用时间建模303.4 实时系统建模工具34第四章 面向方面建模354.1 UML的扩展机制354.2 表示连接点364.

14、3用况实现模块化364.4用UML进行面向方面建模37第五章 实时方面建模395.1 AOP元素表示395.1.1表示切入点395.1.2表示通知与引入405.1.3 表示方面415.2 举例415.3 用况实现模块化445.4 在类图中加入方面455.5在顺序图中加入方面475.6 其它50结论51参考文献53攻读硕士学位期间发表的论文58独创性声明59致谢61ContentsAbstractIIContentsVIIChapter1 Introduction11.1 Background11.2 Necessity21.3 Aspect-Oriented Technique in Real

15、-time Systems31.4 Structure of this Thesis4Chapter2 Approaches to Separate Concerns52.1 AspectJ52.2 AspectC+72.3 Composition Filters82.4 Hyperspace132.4.1 MDSOC132.4.2 Hyperspace152.4.3 Hyper/J162.5 Adaptive Programming17Chapter3 Real-time Systems Software Design213.1 Concepts of Real-time System213

16、.2 Timing Requirements213.3 UML Extension for Real-time System233.3.1 General Resource Modeling253.3.2 General Timing Modeling303.4 Tools for Real-time System Modeling34Chapter4 Aspect-Oriented Modeling354.1 UML Extension Mechanism354.2 Join Point Representation364.3 Use Case Modularity Using AOSD36

17、4.4 Aspect-Oriented Modeling Using UML37Chapter5 Real-time Aspect Modeling395.1 Modeling Constructs of AOP395.1.1 Modeling Pointcut395.1.2 Modeling Advice and Introduction405.1.3 Modeling Aspect415.2 Example415.3 Modularizing Implementation of Use Case445.4 Adding Aspect to Class Diagram455.5 Adding

18、 Aspect to Sequence Diagram475.6 Others50Summary and Future Work51Bibliography53Publications During Masters Studies58Statement of Originality59Acknowledgments61第一章 绪论1.1 研究背景软件开发思想就是抽象与分解,从过程化、结构化分解编程,到现在主流的面向对象编程,开发典范(paradigm)发生了很大变化,唯一不变的就是抽象与分解的思想,只是抽象的种类和质量、分解的方法发生了变化。当前,面向对象编程(OOP)1和基于组件的软件开发得

19、到了广泛的使用,面向对象技术能够很好地将现实世界领域中的实体和它的行为建模为抽象的对象。系统变成一系列相互协作的对象,类的封装性隐藏了实现的细节;类的继承性实现了重用;多态性使得不同对象接收到相同消息时产生不同的动作。确实,OOP表明了它处理复杂问题的能力,但是OOP无法模块化横切(crosscut)整个系统的关注点(concern),这些关注点称为横切关注点(crosscutting concerns),如时间要求、安全、QoS监测、日志等等。这些非功能单元弥散在整个系统中,导致了代码分散(code scattering);并且与功能单元混杂在一起,导致了代码纠缠(code tangling

20、)。这样降低了程序的可理解性、适应性、可维护性和可复用性。OOP中用混入类来处理横切,但是基本类需要显式调用混入对象的方法,即操作的逻辑由基本类控制,且好的系统设计师要考虑当前和将来可能的需求以避免打补丁,但是预知将来的需求是困难的,这样系统设计师陷入了“应该宁可设计不足还是宁可过分设计”的两难境地。其它解决方法如行为型设计模式也是由基本类控制操作逻辑,面向特定领域的解决方式(如框架)仅提供这个领域的处理关注点的方式,所以属于这个领域外的关注点需要特殊处理。解决问题需要分离关注点,将不同的关注点分离成模块,而这些模块可以单独实现。这样开发功能模块时无需要考虑非功能需求,在功能模块里不出现非功能

21、代码;各个非功能模块也单独实现。系统有信息描述如何将这些模块可控地组合起来形成结构和行为明确的系统。系统信息主要描述了在何处非功能模块影响其他模块的结构和行为,有的方法将这些信息包含在非功能模块里,有的方法将这些信息放在配置文件内。通过分离关注点,开发人员可以只关注感兴趣的部分。并且当需求改变后,只需修改受影响的模块,而这些模块往往只在一处出现,这样避免了在整个程序内修改。已经有很多分离关注点的方法,这些方法可以统称为面向方面编程(AOP, Aspect Oriented Programming)2,虽然在这个概念提出之前,已经有很多这方面的研究。面向方面编程将关注点实现为分离的方面,然而实现

22、仅仅是软件开发过程中的一个阶段。现在已经开始研究在需求、设计等其他开发阶段如何有效地分离关注点,目标是要在整个软件开发过程应用面向方面技术,从而形成面向方面的软件开发(AOSD, Aspect Oriented Software Development)。这些研究主要集中在如何扩展UML3使其支持面向方面技术。现在面向方面编程还在研究过程中,面向方面的软件开发方法的研究也刚刚起步,但是它们代表了未了软件开发的方向,Grady Booch预言AOP将崛起4。1.2研究意义实时嵌入式设备被广泛使用在现代生活中,实时控制系统是现代化生产的保证,复杂的实时系统在国防现代化建设中发挥越来越重要的作用。这

23、些系统广泛应用在对时间有较高要求的环境中,如汽车,飞机,核反应堆等的控制中,这些系统的失败轻则导致经济财产损失,重则生命丢失。实时系统是面向方面很好的应用场所,因为在实时系统中,有很多非功能需求,且这些非功能需求往往横切整个系统。在实时系统中关键的就是时间要求了,如果系统没有在给定的时间里完成任务,任务是失败的,这些时间要求散布在整个系统的功能部件里,带来了前述的代码混乱和代码分散问题,导致系统代码不易读,不易修改,易产生不一致,重用性差,不易修改和升级等一系列问题。实时系统的一个重要特点就是要求系统具有可预报性,要判断是否调度是可行的,这需要收集系统当前信息和QoS信息,追踪系统执行情况,这

24、些代码也混在功能部件里。实时系统是高可靠性的系统,软实时系统(soft real-time system)任务的失败会使系统性能降低,但是有些安全关键(safety-critical)的硬实时系统(hard real-time system)的失败将会带来灾难性的后果,如核反应堆控制系统,武器控制系统等,这些系统的失败将会有生命的代价。但是系统故障是不可避免的,因为硬件和软件不可能设计的完全正确,所以实时系统需要容错,这样一个系统里的容错代码也弥漫在整个系统中,导致前述问题。实时嵌入式系统也有安全上的需求,以防止非授权用户的进入,同样这些非功能性代码也会弥漫在整个系统中。为了提高性能和达到可预

25、报性,实时系统需要特别的资源管理策略,如为了可预报性,不使用缓存和虚存机制,因为缺页会导致时间不可预报。另外为了提高系统性能,需要对内存进行管理,这些管理策略会弥漫在整个功能部件里。所以有必要把这些非功能代码从功能部件里分离出来。分别编写功能部件和非功能方面,然后把它们组合在一起。实时系统在社会和国家生活中应用越来越广泛,影响也越来越大,系统也越来越复杂。根据上述实时系统特点和面向方面开发的特点,可以得出把面向方面技术应用到实时系统开发中很有必要。1.3面向方面技术在实时系统中的应用研究者已经开始探索如何将面向方面技术应用在实时系统中。在实时系统和嵌入式系统中建立了一些模型5,6。5提出了AC

26、CORD(AspeCtual COmponent-based Real-time system Development)设计方法,也提出了一个RTCOM(Real-Time Component Model)模型。使用ACCORD开发实时系统的过程是:第一阶段把把实时系统按功能和低耦合高内聚的要求分解为一系列的组件;第二阶段把实时系统分解为一系列的方面,方面横切组件和整个系统,这个阶段处理非功能需求和横切关注点;最后按RTCOM实现组件和方面。RTCOM允许把方面编织到组件里,包括三部分:(1)功能部分;(2)运行时系统依赖部分;(3)组合部分。另外把方面分为三类:(1)应用程序方面;(2)运行

27、时方面;(3)组合方面。嵌入式系统的一个重要特征是依赖环境。6提出了一个对嵌入式系统进行面向方面的环境建模方法。7把面向方面编程技术应用到实时操作系统开发上。因为在实时操作系统里有许多横切的特征,为了满足日益增长的对实时操作系统快速定制的要求,需要面向方面编程技术,这里把函数看成一系列的基本块,基本块的功能代码可由不同的方面提供,这样横切了函数,且这些基本块可视,提供了图形表示的开发框架;支持类的组装,不同方面里的相同的类可以组成一个大类。8展示了如何把面向方面技术应用的分布式实时系统上。分布式实时系统中的非功能需求可以用方面来表达,这篇文章给出了一个把分布性、时间要求和容错方面加入到一个简单

28、的日志组件里的方法。9,10把面向方面应用到DisCo(Distributed Co-operation)系统中,DisCo 是描述反应式系统的形式化规格说明方法。1.4 研究内容本文比较完整地分析介绍了分离和模块化关注点的方法,以及面向方面社区对面向方面建模的研究;阐述了实时系统中实时需求的主要概念和建模方法;提出了一个新的通过扩展UML进行面向方面建模的方法,并将这个方法应用于实时系统开发。论文结构安排如下:第一章介绍了面向方面编程可以模块化非功能关注点;分析了实时系统中的非功能关注点以及实时系统中使用面向方面技术的现状。第二章介绍了典型的分离关注点的方法。第三章阐述了实时系统中的实时需求

29、,以及用UML建模实时系统的方法。第四章分析介绍了面向方面社区对面向方面建模的研究。第五章提出了一个新的扩展UML来表达面向方面中的元素和机制,阐述如何将这种方法应用于实时系统开发中。第二章 分离关注点的方法系统中的非功能需求往往横切整个系统,传统的结构化方法以及现代流行的面向对象方法无法很好地模块化这些非功能需求,导致了实现非功能需求代码的分散和与功能代码纠缠在一起,造成代码量急剧增加,开发效率低,可读性差,极易引起不一致等问题,所以需要分离这些非功能关注点。对于如何有效的分离关注点,人们已经提出了很多方法。如AspectJ、组合过滤器、多维关注点分离和自适应编程等。2.1 AspectJG

30、regor Kiczales等人于1997年提出了面向方面编程(AOP, Aspect-Oriented Programming)概念2,开发出了第一个基于Java的AOP实现AspectJ11。AspectJ引入了连接点(join point)这个概念,以及切入点(pointcut)、通知(advice)、类型间声明(inter-type declaration)和方面(aspect)的构造块。连接点为程序流中的一些特殊点,包括方法调用与执行,构造函数调用与执行,类或对象初始化,成员变量的访问和修改,异常处理执行,通知执行等。方面可以在这些点改变系统的行为。切入点组合了连接点,并可以提供连接

31、点处执行上下文的信息。切入点主要用于通知,通知在切入点改变系统行为。AspectJ定义了原子切入点(primitive pointcut),如“call(void Point.setX(int)”;也定义了与(&)、或(|)、非(!)来组合切入点。可以用通配符来收集多种连接点,如“call(void Point.set*(.)”,表示调用Point的以set开头且返回值为void的函数,不论这些函数的参数类型和个数。通知在切入点影响系统的行为。通知有多种类型,before通知在指定连接点抵达但与该连接点相连的程序运行前执行;after returning通知在指定连接点处的程序成功返回后执行;

32、after throwing通知在指定连接点处程序抛出Throwable对象后执行;after通知在指定连接点程序执行后执行,不论成功返回还是抛出异常;around通知在指定连接点处执行,只有在around通知体里显式调用proceed,该连接点处的程序才能执行。类型间声明改变程序的结构。在方面里可以声明其他类型拥有的成员(成员变量、成员函数、构造函数),也可以声明一些类型实现一个新的接口或继承一个新的类。方面将这些切入点、通知、类型间声明封装起来,形成一个关注点,与类一样,方面也可有成员变量和成员函数。同一个连接点可以被多个方面或一个方面里的多个通知影响,AspectJ定义了这些方面和通知的

33、优先关系。这些概念以及构造块的详细内容可以参考12。图2-1是一个电信模拟的计时方面。public aspect Timing public long Customer.totalConnectTime = 0;public long getTotalConnectTime(Customer cust) return cust.totalConnectTime;private Timer Connection.timer = new Timer();public Timer getTimer(Connection conn) return conn.timer; after (Connecti

34、on c): target(c) & call(void Cplete() getTimer(c).start();pointcut endTiming(Connection c): target(c) &call(void Connection.drop();after(Connection c): endTiming(c) getTimer(c).stop();c.getCaller().totalConnectTime += getTimer(c).getTime();c.getReceiver().totalConnectTime += getTimer(c).getTime();图2

35、-1 Timing方面12它给每个连接引入一个计时器,给每个用户引入一个保存全部连接时间的变量。在连接建立完成时开始计时,在连接断开后,停止计时,并计算连接时间和增加通话用户的全部连接时间值。AspectJ编译器是一个编织器(weaver),它可以将方面织入到它所影响的其他方面或类里,以改变系统的结构和行为。这样,系统的关注点可以分别编写,从而有效分离了关注点,然后将这些模块化的关注点通过编织器组合在一起,形成满足需求的系统。2.2 AspectC+AspectC+13,14对C+进行扩展以支持面向方面编程,它参考AspectJ所使用的方法来对另一种编程语言进行扩展,所以它们的模型基本相同,语

36、法上有些不同。在AspectJ中“*”,表示通配符,但是在C+中“*”用来声明指针,为避免二义性,在AspectC+中以“%”表示通配符。在AspectC+中以“:”代替AspectJ中的“.”来表示作用域解析。以“”来匹配函数签名的任意数量形参。在AspectC+中,有两种切入点:名字切入点(name pointcut)和代码切入点(code pointcut)。名字切入点是类型、属性、函数、变量和名字空间的名字,如“%Array”表示任何以“Array”结尾的class、struct或union;“void draw()”匹配有任意数量形参和返回类型为“void”的函数draw。代码切入点

37、要调用AspectC+定义的函数且以名字切入点为参数来形成,如:call(“void draw()”)描述了一系列的函数draw调用。另外,为了重用切入点,可以用pointcut(pointcut为关键字)表达式对切入点命名,即命名切入点(named pointcut),如pointcut Arrays()=derived(“Array”),这样Arrays能用在表示derived(“Array”)切入点表达式可用的任何地方。在AspectC+中也有两类连接点,名字连接点用来形成名字切入点,如程序中的类名;代码连接点用来形成代码切入点,如程序中的函数调用和执行。对于名字切入点,通知可以扩展程序

38、代码和数据结构,即引入(与AspectJ中类型间声明一样)。对于代码切入点,通知在切入点影响系统的行为。与AspectJ一样,方面以模块化的方式收集横切关注点的advice代码和引入。图2-2显示了TraceShape 方面来记录Shape类型的对象的构造和析构。aspect TraceShapepublic:static int m_created,m_destroyed;pointcut shapes()=derived(Shape);advice shapes(): class Helperpublic:Helper()TraceShape:m_created+;Helper()Trac

39、eShape:m_destroyed+;m_counter;advice execution(% main(.) : after()printf(shape created:%d,destroyed:%d,m_created,m_destroyed);int TraceShape:m_created=0;int TraceShape:m_destroyed=0;图2-2 TraceShape方面2.3 组合过滤器(Composition Filters,CF)CF是语言独立的模型,它以模块化和正交化(orthogonal)的方式扩展了面向对象模型。 模块化的扩展意味着过滤器可以附贴在对象上而不

40、改变对象的定义,这样过滤器与实现独立;正交化的扩展即过滤器之间的语义互相独立,这样过滤器可以组合15。因为对象之间的通信的机制是消息,这个模型通过过滤器来操控进入或出去的消息来改变对象的行为,图2-3 描述了这个模型的组成部分。图2-3 CF模型的组件16上图描述了一个CF模型中的对象,这个对象包括接口和实现两部分。接口部分包括接口对象I声明(被封装了的内部对象和被引用了的外部对象),状态S(state, condition)声明,类方法M声明和过滤器F;实现部分包括实例变量声明,类方法和状态的实现,以及初始化方法。对象可以用四元组表示17。接口对象的申明方式是为objectName:Clas

41、sName;状态s表示为: 。状态可以看成一个用proposition表示布尔函数,用id可以引用这个状态。对象的所有方法U0包括对象内部定义的方法M0和接口对象定义的方法(满足递归规则): 过滤器定义为:handler(f)即过滤器处理器(filter-handler),它定义了当消息到达过滤器时如何操控这个消息。A(f)被称为接受集合(accept set function),是一个有序的集合A。A定义了状态方法对集合,状态s决定了消息(方法)m是否被接受。消息必须被过滤器集合检查,检查的算法如图2-4:1) algorithm pass_filters(m, F)2) forall f

42、in F = f1, ., fn do3) accept := false;4) forall in A(f) = , ., do5) if (m = mj)sj then6) begin7) accept := true;8) dest := target(mj);9) break;10) end;11) endfor;12) if accept13) then handler(f).acceptMessage(m)14) else handler(f).rejectMessage(m);15) endfor;16) dispatch(m, dest);17) end pass_filter

43、s;图2-4 检查接受的消息算法17消息要被所有的过滤器检查,过滤器用它的接受集合检查消息,如果满足接受集合里的一个元素,那么通过当前过滤器的检查,然后转到下一个过滤器。如果消息不满足当前过滤器的接受集合所有元素,消息根据过滤器处理器的类别拒绝消息。当通过最后的过滤器后,消息被分发。预定义的过滤器类:Dispatch 过滤器:如果接受消息,消息分发到消息的当前目标对象;否则消息传递到下一个过滤器(如果没有了过滤器,会产生异常)。Error过滤器:如果拒绝消息,产生异常;否则传递到下一个过滤器。Wait过滤器:如果接受消息,消息传递到下一个过滤器;否则排队等待接受。Meta过滤器:如果拒绝消息,

44、消息传递到下一个过滤器;否则根据这个消息生成一个对象,并把这个对象作为参数传到新的消息(接受集合元素的第二部分)中。接受到这个新消息对象可以操控这个消息。在实时系统中,继承以前经过验证的模块很重要,但是实时需求的改变往往会导致过多的重新设计,这种情况称为实时需求继承反常,即子类时间需求改变导致在子类里出现过多的重新设计而不是继承父类的已有实现。下面用18中的例子介绍实时需求继承反常以及用CF模型解决的方法。类DistributionNode代表一个电力分配网中的一个结点。这个节点有一条电力产生线和多条电力消费线。结点控制电流从生产线流向消费线。当生产线断开时,所有的消费线都要在预定义的时间内断

45、开。结点可以看成时一个电磁开关,用ElMagneticSwitches定义,这个类里为每条线定义了连接和断开方法。假定有一个FastDistributionNode,它是DistributionNode的子类,FastDistributionNode定义消费线断开的截至时间比它的父类更紧迫。但是由于实时需求与应用代码混和在一起,子类需要重新定义消费线的断开方法,以使用新的时间约束,这样父类的断开方法无法重用,出现了第一种反常。用CF解决的方法是把时间约束放到过滤器中,过滤器把时间约束加到接受的消息上,如图2-5。当子类的时间约束改变后,新的时间约束放到子类的过滤器中,当调用子类的方法时(继承自

46、父类),子类过滤器给接受的消息加上新的时间约束,如图2-6。 (1) class DistributionNode interface(2) begin(3) internals(4) mySwitch: ElMagneticSwitches;(5) methods(6) productionLineDisconnected returns nil;(7) disconnectConsumerLine(Integer) returns nil;(8) inputfilters(9) giveTimeSpec: RealTime = True = self.* | time.minEnd( tconsumer ) | ;(10) setTimeForProduction: RealTime = True = self.productionLineDisconnected(11) | time.setEnd( numberOfLines *

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号