ASN.1是否支持某种形式的继承?

时间:2017-04-20 16:13:38

标签: inheritance 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 个答案:

答案 0 :(得分:2)

我不确定如何定义继承,但您可以使用Human来定义ShortHuman,如下所示:

ShortHuman :: = Human(WITH COMPONENTS {height(120..150)})

这会根据您的需要限制高度。

实际上,最好使用以下内容:

ShortHuman :: = Human(WITH COMPONENTS {...,height(120..150)})

部分规范不对未列出的组件设置任何限制,而完整规范(没有......,)将要求不存在未列出的可选组件(例如年龄)。

答案 1 :(得分:0)

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

您可以使用参数化来定义Human和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功能,用于"重用"适合某种模式的定义。请注意,您也可以使用类型的参数,因此,作为一个不太可能的示例,您可以为" name"使用不同的字符串类型。在人类与短人类型中。 X.683涵盖参数化。