Home > NED, OMNeT++ > OMNet++ 中的 NED 语言学习(2)

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:

  1. OMNet++ 中的 NED 语言学习(1)
  2. OMNet++ 中的 NED 语言学习(3)
  3. OMNet++ 中的 NED 语言学习(4)
  4. OMNet++ 10 分钟教程
Categories: NED, OMNeT++ Tags:
  1. January 25th, 2010 at 11:24 | #1

    比我那里热闹

    ReplyReply
  1. No trackbacks yet.