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

Does ASN.1 supports some form of inheritance?

例如,假设我这样定义:

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 并改进该描述吗?

我不知道你是怎么定义继承的,但是你可以使用Human来定义ShortHuman,如下所示:

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

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

实际上,使用以下内容可能更好:

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

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

ASN.1 本身并不使用术语 "inheritance"。 X.680 中的附件 C,"Rules for type and value Compatibility" 讲了 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 }

参数化是 "reusing" 符合某种模式的定义的常用 ASN.1 功能。请注意,您还可以使用类型参数,因此,作为一个不太可能的示例,您可以在 Human 与 Short Human 类型中为 "name" 使用不同的字符串类型。 X.683 涵盖参数化。