OMNet++ 中的 NED 语言学习(2)
本节介绍简单模块。
简单模块是在模型中活动的组件,它用关键字 simple 来定义。
simple Queue
{
parameters:
int capacity;
@display("i=block/queue");
gates:
input in;
output out;
}
Parameters和gates部分都是可选的,即是说如果没有parameter或gate的话就可以不写。而且parameters关键字本身也是可选的,就算参数和属性存在也可以忽略它。
NED定义不包含模块的任何操作,操作是用C++来定义的,默认情况下OMNet将查找与NED类型同名的C++类(在这里是Queue)。
可以用@class 属性直接指定C++类,类也可以包括命名空间,如下例使用了mylib::Queue
simple Queue
{
parameters:
int capacity;
@class(mylib::Queue);
@display("i=block/queue");
gates:
input in;
output out;
}
如果几个模块都在相同的命名空间里,那最好用@namespace代替@class属性,例如下面的例子会自动添加命名空间mylib作为前缀:
@namespace(mylib);
simple App {
...
}
simple Router {
...
}
simple Queue {
...
}
@namespace能在文件层次上指定,进一步地,当放在一个名为package.ned的文件中时,命名空间会应用于相同的文件夹及其子文件夹。
C++的实现需要将cSimpleModule作为基类, 在以后会有更进一步解释。
简单模块通过继承可以扩展(或特例化),例如可以将一些参数和gate size设为固定值,或者用不同的类实现来代替,现在默认情况下,派生的NED模块类型会从它的基类继承C++类,所以要记得在使用新的class的时候,要加上@class属性。
下面例子没有改变C++类,但固定了参数值来将一个模块特殊化:
imple Queue
{
int capacity;
...
}
simple BoundedQueue extends Queue
{
capacity = 10;
}
而在下一个例子中,则编写了一个C++类,并想要拥有一个对应的派生于Queue的NED类型,然而,它不能像期待中那样正常工作:
simple PriorityQueue extends Queue // 错误:仍然会使用 Queue C++ 类
{
}
正确的做法是加上@class属性来重写所继承的C++类:
simple PriorityQueue extends Queue
{
@class(PriorityQueue);
}
在后面的系列中会详细介绍继承。
Related posts:
比我那里热闹