标签:uid 显示 ali except virt try 接受 工作 zab
接线和初始化
组件的行为是由其提供和使用的接口定义的。在黑盒复用中,一个组件由它的IObject接口代表。接口就是一个组件函数的接入点。出于这个理由,一个支持黑盒复用的组件一定被默认为可构造的(有一个默认的构造器)。初始化、配置以及一个组件的利用一定要通过它的接口才可以得到实现。
为了允许一个组件去使用其他的接口。一个特别类型的用户接口被定义了。如下:
virtual public IObject
{
public:
virtual ~IEchoUser(void) BOOST_NOEXCEPT {}
virtual void Use(Ptr<IEcho> echo) = 0;
};
NSFX_DEFINE_CLASS_UID(IEchoUser, "edu.uestc.nsfx.tutorial.IEchoUser");
一个用户接口拥有类似于IXxxUser类型的名字。它提供了单独的虚拟函数Use(),接受被使用接口的一个参数。
为了简化用户接口的定义,NSFX提供了一个宏NSFX_DEFINE_USER_INTERFACE()。下面的定义与上述例子等价。
NSFX_DEFINE_USER_INTERFACE(IEchoUser, "edu.uestc.nsfx.tutorial.IEchoUser",
IEcho);
对于一个需要使用IEcho接口的组件,它会露出IEchouser的接口来允许组件的用户提供给它必须的接口。如下:
class SomeComponent :
public IEchoUser
{
public:
...
virtual void Use(Ptr<IEcho> echo) NSFX_OVERRIDE
{
echo_ = echo;
}
private:
NSFX_INTERFACE_MAP_BEGIN(SomeComponent)
NSFX_INTERFACE_ENTRY(IEchoUser)
NSFX_INTERFACE_MAP_END()
private:
Ptr<IEcho> echo_;
};
NSFX_REGISTER_CLASS(SomeComponent, "edu.uestc.nsfx.tutorial.SomeComponent");
在上面的例子中,SomeComponent在它的接口地图中露出了IEchoUse。因此,它明确的表达了在它正常工作前它需要一个IEcho接口。
组件和它使用的接口之间有着紧密的联系。提供给一个组件它所使用的所有接口的过程被称之为布线。这个词汇来源于TinyOS。
一旦所有的接口都被提供,一个组件就能后被初始化了。一般而言,组件通过暴露它的IInitializable接口来允许它的用户对它进行初始化。
IInitializable接口定义如下:
class IInitializable :
virtual public IObject
{
public:
virtual ~IInitializable(void) BOOST_NOEXCEPT {};
virtual void Initialize(void) = 0;
};
NSFX_DEFINE_CLASS_UID(IInitializable, "edu.uestc.nsfx.IInitializable");
下面的例子显示了对一个组件同时进行布线和初始化。
// Create.
Ptr<IObject> e = CreateObject<IObject>("edu.uestc.nsfx.tutorial.Echo");
Ptr<IObject> o = CreateObject<IObject>("edu.uestc.nsfx.tutorial.SomeComponent");
// Wire.
Ptr<IEchoUser>(o)->Use(e);
// Initialize.
Ptr<IInitializable>(o)->Initialize();
学习资源自:https://github.com/Fuzzier/nsfx/blob/tutorials/tutorials.md#objectt
标签:uid 显示 ali except virt try 接受 工作 zab
原文地址:https://www.cnblogs.com/lx61/p/12189244.html