1. 结构和语义
合同是一种继承机制,它们建立了经典的“是一种”关系。在抽象意义上,合同允许继承类型,可以进一步区分显式和隐式,含义如表5-9 所示。
表5-9 显式和隐式合同
例如,当一个对象实现警报合同时,可以立即推断它将有一个名为timestamp的子节点。此结构与Alarm 的显式合同相关,并在其编码定义中正式定义。当一对象声明自己实现一个合同时,它必须同时满足显式和隐式。
一个对象绝不能把obix:Alarm 放在合同列表中,除非它真的代表一个报警事件。隐式合同的解释通常要求需要人工,即它们通常不能与纯机器对机器交互的场合一起使用。
2. 覆盖默认值
合同的命名子对象自动实现。实现可以选择覆盖或默认其合同的每个子项,如果实现省略子项,则假定它默认为Contract 的值。如果实现声明了子节点(通过名称),那么它将被覆盖并且应该使用实现的值,我们来看一个例子:
在此示例中,使用URI“/ def/television”标识合同对象。它有两个孩子来存储电源和通道。起居室电视实例通过 is 属性在其合同列表中包括“/def/television”。在此对象中,通道从其默认值2 重写为8,但是,省略了电源,因此默认为默认值。(www.xing528.com)
覆盖始终通过name 属性与其Contract 匹配。在上面的示例中,很明显“通道”被覆盖,因为声明了一个名为“channel”的Object。还声明了第二个Object,其名称为“volume”。由于未在合同中声明音量,假定它是特定于此对象的新定义。
3. 属性和特征
需要注意的是合同的channel 对象声明了最小和最大Facet。这两个Facets也是由实现继承的。几乎所有属性都从它们的合同继承,包括Facets,val,of,in 和out,但是href 属性永远不会继承,null 属性继承如下:
(1)如果指定了null 属性,则使用其显式值;
(2)如果指定了val 属性且未指定null,则表示null 为false;
(3)如果既未指定val 属性也未指定null 属性,则null 属性从合同中继承;
(4)如果指定了null 属性且为true,则忽略val 属性。
这允许我们隐式地将null Object 重写为非null 而不指定null 属性。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。