以下内容是基于《开源网络模拟器ns-3 架构与实践》的学习笔记
Object类是大部分网络元素类的基类,继承了SimpleRefCoumt类和ObjectBase类,实现了对象聚合功能。
有些Object子类的使用涉及很多其他子类的对象,通过对象聚合技术,统一其他子类对象指针的操作方式。
传输层(Protocol)和网络层(Protocol)对象指针存贮在聚合数组(指针数组)中。大部分协议对象(Protocol)指针都存贮在聚合数组。但是应用层(Application)、链路层(NetDevice)对象指针分别单独存贮在两个指针向量容器(std::vector)中。
1、对象聚合的技术原理
1)对象聚合简化了关联对象的获取方法。集合数组中任意两个对象都可以使用Object::GetObject()互相访问,只需提供对象所属的类名称即可。
Prt<IpL4Protocol> ipL4Proto=node->GetObject<IpL4Protocol>()
Prt<Node> node=ipL4Proto->GetObject<Node>()
2)程序开发简便
对象聚合技术的原理:主要是通过在基类Object用类模板定义提取、设置函数、和存贮操作,比如Object::GetObject()函数,从而Object子类不需要定义多个名称各不相同的提取、和设置函数去关联对象。值得注意的是,在Object基类定义了一个Object指针数组(聚合数组),将关联对象的存取、提取和设置都统一起来了。
- 统一存储:所有关联对象指针均以Object指针类型存储在聚合数组中。
- 统一提取方法:GetObject()函数用于从聚合函数中查找并返回指定对象指针。
- 统一设置方法:AggregateObject()函数用于向聚合数组添加元素。
2、对象聚合的适用范围
一个类在对象聚合数组中最多只能有一个示例对象(GetObject()函数