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,因为这种情况更准确地反映了这些关键字之间的关系。