2017-04-20 52 views
1

例如,假设我定义是这样的:ASN.1是否支持某种形式的继承?

World-Schema DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN 
    Human ::= SEQUENCE { 
    name UTF8String, 
    first-words UTF8String DEFAULT "Hello World", 
    age INTEGER (1..150) OPTIONAL, 
    height INTEGER (120..200) 
} 
END 

现在我想定义一个ShortHuman,这是完全一样的,但height被限制为150。我可以以某种方式重新使用已定义Human和完善那个描述?

回答

2

我不知道你怎么定义继承,但是你可以用人力来定义ShortHuman如下:

ShortHuman :: =人(含组件{身高(120..150)})

这会限制你想要的高度。

其实,这可能是更好的使用以下命令:

ShortHuman :: =人(含组件{...,高度(120..150)})

的部分规范不对未列出的组件进行任何限制,而完整规范(不包含...)将要求未列出的可选组件(如年龄)不存在。

+0

谢谢。这正是我所期待的。也许继承,这不是在这种情况下最合适的名称。 –

0

ASN.1本身并不使用术语“继承”。附件C,X.680中的“类型和值兼容性规则”讨论了ASN.1类型之间的关系,如果你想阅读它的话。

你可以使用参数来定义人与ShortHuman像这样:

HumanBase { INTEGER : maxHeight } ::= SEQUENCE { 
    name UTF8String, 
    first-words UTF8String DEFAULT "Hello World", 
    age INTEGER (1..150) OPTIONAL, 
    height INTEGER (120..maxHeight) 
} 

Human ::= HumanBase { 200 } 

ShortHuman ::= HumanBase { 150 } 

参数是“再利用”的定义适合某种模式常用的ASN.1功能。请注意,您也可以拥有类型参数,因此您可以(作为不太可能的示例)在Human vs. Short Human中使用不同的字符串类型作为“name”。 X.683涉及参数化。