GDL 练习说明

下面的代码示例演示分析程序为所有 GDL 练习生成的索引树。

      <:ROOT2>
    *PFeature : InputTray    <:INPUTTRAY_FEATURE>
        *POption : Lower    <:INPUTTRAY_OPTION2>
            *Capacity    <:TRAY_CAPACITY>
            *Command    <:ACOMMAND>
            *Name    <:INPUTTRAY_OPT_NAME>
        *POption : Upper    <:INPUTTRAY_OPTION2>
            *Capacity    <:TRAY_CAPACITY>
            *Command    <:ACOMMAND>
            *Name    <:INPUTTRAY_OPT_NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>
    *PFeature : PaperSize    <:PAPERSIZE_FEATURE>
        *POption : Custom    <:CUST_PAPERSIZE_OPTION>
            *MinSize    <:MIN_SIZE>
            *MaxSize    <:MAX_SIZE>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : OEMName_Special_size    <:OEM_PAPERSIZE_OPTION>
            *OEM_Info    <:OEM_INFO>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : A4    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : Legal    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : Letter    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>
    *PFeature : random    <:PFEATURE >
        *POption : First    <:GENERIC_OPTION>
            *Command    <:ACOMMAND>
            *Name    <:NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>

*Name 和 *POption 条目映射到多个模板,每个模板具有不同的语义。 例如,*名称映射到 NAME、INPUTTRAY_OPT_NAME 或 PAPER_SIZE_OPT_NAME。 *POption 映射到GENERIC_OPTION、PREDEFINED_PAPERSIZE_OPTION、CUST_PAPERSIZE_OPTION、OEM_PAPERSIZE_OPTION或INPUTTRAY_OPTION2。 如果模板结构已正确定义,则遵循其模板化规则分析程序将找到最合适的模板。

注意 随着架构变得更加详细,这些练习会建立一些基本模板和随后派生的变体。 此过程模拟架构在现实生活中的发展方式。 继承允许扩展练习架构,而无需更改任何以前定义的模板。 此功能使第三方能够扩展主架构,并确保任何第三方架构扩展仍与原始主架构的用户兼容。

显示的练习答案并不唯一。 例如,可以采用以下方式从 PAPERDIMENSIONS 派生MIN_SIZE和MAX_SIZE模板。

*Template:  MIN_SIZE
{
    *Name: "*MinSize"
    *Inherits: PAPERDIMENSIONS
}
*Template:  MAX_SIZE
{
    *Name: "*MaxSize"
    *Inherits: PAPERDIMENSIONS
}

请注意,PAPER_SIZE_OPT_NAME和INPUTTRAY_OPT_NAME模板继承自模板 NAME,并重新定义 *Name 条目。

重新定义 *Name 条目的效果是从基本模板建立的继承树中隐藏这些派生模板。

通常,当模板将 NAME 声明为 *Member 时,此声明意味着派生自 NAME 的所有模板也是 *Members。 但是,具有重新定义的 *名称条目的派生模板将从派生模板的隐式 *成员列表中排除。 如果没有此排除项,最初映射到模板 NAME 的数据条目 (例如,*Pfeature) 中显示的名称将映射到INPUTTRAY_OPT_NAME () 不正确。

如果预计在架构的原始设计过程中将 NAME 专用化为PAPER_SIZE_OPT_NAME并INPUTTRAY_OPT_NAME,则只需从GENERIC_OPTION的“成员”列表中删除 NAME 即可产生不同的架构实现。 此更改将使重新定义 *Name 变得不必要。 进一步的设计优化将具有从通用虚拟模板继承的 NAME、PAPER_SIZE_OPT_NAME 和 INPUTTRAY_OPT_NAME,因为这种情况更准确地反映了这些关键字之间的关系。