NSFX手册的学习(10)

接线和初始化

组件的行为是由其提供和使用的接口定义的。在黑盒复用中,一个组件由它的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
 

猜你喜欢

转载自www.cnblogs.com/lx61/p/12189244.html