首页 理论教育 通用组件的定义与实例化详解

通用组件的定义与实例化详解

时间:2023-06-28 理论教育 版权反馈
【摘要】:例3.31:参数列表为空的通用配件组件TimerMilliC是一个通用配件,没有携带参数,也就是说,参数列表为空。实例化通用组件使用关键字new,并需填写传递的实参。BitVectorC是通用组件,配件SystemServiceVectorC实例化BitVectorC后,将其接口输出,以便于其他组件使用。例3.34:在Blink应用中,使用通用组件TimerMilliC的三个实例,为了对这三个进行区分,需要使用关键字as设定别名。

通用组件的定义与实例化详解

1.通用组件的定义

组件分为模块和配件,相应的,通用组件也分为通用模块和通用配件。通用组件的定义中要使用关键字generic。另外,在语法方面与单一组件不同的地方是,通用组件有一个参数列表。参数列表跟在组件名后面,用圆括号括起来。一般来说,通用组件支持三种类型的参数:类型、数字常量和字符串常量。如果参数是类型,则使用关键字typedef声明。这些参数可以在多处使用,比如,组件规范中的通用接口的类型、接口函数中的参数或返回值类型,模块变量的定义或声明等。参数列表也可以为空。

通用模块与通用配件的一般形式:

例3.30:有参数的通用组件

组件VirtualizeTimerC是一个通用模块。它有两个参数:第一个参数是计时器精度的类型,是用关键字typedef声明的。这种精度类型提供了额外的对接口类型的检测,因为这个参数在提供和使用的通用接口Timer中被用于指定接口的精度类型;另一个定义了组件所提供的最大的虚拟定时器的数量,它的值通常由编译函数uniqueCount()计算得到。

例3.31:参数列表为空的通用配件

组件TimerMilliC是一个通用配件,没有携带参数,也就是说,参数列表为空。注意:即便通用配件没有参数,配件名字后面的圆括号也不能省略。

2.通用组件的实例化 (www.xing528.com)

使用通用组件需要先实例化它。实例化通用组件实际是复制组件代码。组件代码复制就是逐字地创建源文件的副本。代码复制作用于通用模块时,是将可执行代码和变量拷贝到最后的应用中。代码复制作用于通用配件时,表现为实例化其他组件并创建连接。也就是说,通用模块定义了重复的可执行逻辑,通用配件定义了组件组织关系的重复模式。

实例化通用组件使用关键字new,并需填写传递的实参。

以上代码创建一个向量长度大小为10bit的通用模块BitVectorC,该语句实际上是创建BitVectorC代码的副本。在创建的通用模块BitVectorC的新实例的代码中,由10代替参数max_bits。

通用组件只有在实例化它的配件中被命名,对于实例化该通用组件的配件而言,它是私有的,其他组件不可以直接使用它。上述例子中,在配件ExampleVectorC中实例化了通用化模块BitVectorC,因此,BitVectorC(10)对于配件ExampleVectorC是私有的,其他组件不能访问它。那么如何使用实例化的通用组件呢?可以使用我们先前介绍的方法,即输出通用组件实例的接口。

例3.33:一个位向量负责跟踪系统是否正在运行,多个组件都需要访问这个位向量。BitVectorC是通用组件,配件SystemServiceVectorC实例化BitVectorC后,将其接口输出,以便于其他组件使用。

上述2个例子都只对通用组件BitVectorC实例化1次,即只需要一个实例,这种情况可以使用关键字as设置别名,也可以不用。但是,如果在配件中需要通用组件的多个实例,实例化时需使用关键字as设置别名。

例3.34:在Blink应用中,使用通用组件TimerMilliC的三个实例,为了对这三个进行区分,需要使用关键字as设定别名。其代码可参考例3.18。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈