导入

正如我们前面所看到的,导入基本上有三种形式。在所有情况下,import语句创建了一个“别名”去引用模型外定义的类型。

第一种形式采用类型的全限定名引入定义,例如:

import Modelica.SIunits.Temperature;

导入的结果是,对名称Temperature的引用会映射到全限定名Modelica.SIunits.Temperature处。换言之,由import声明引入别名Temperature,并将其映射到在Modelica.SIunits.Temperature出现的定义。这种形式的导入会让别名总与被导入名称的最后一个元素相同。

在某些情况下,我们希望别名与被导入名称的最后一个元素不同。这种情况下,我们可以明确地引入一个替代名称。例如:

import DegK = Modelica.SIunits.Temperature; // Kelvin

在上述的导入后,我们就可以使用别名DegK指代Modelica.SIunits.Temperature。提供替代名称可避免命名冲突,或者只是为了让模型更具可读性。

最后,也可以在一个包中导入所有定义到当前作用域。这可以通过通配符导入实现。例如,要导入Modelica.SIunits包内的所有定义,我们可以使用下面的import语句:

import Modelica.SIunits.*;

上述导入会创建和Modelica.SIunits内总定义数目相等的别名。别名名称的唯一可能性就是和所导入包内定义的原名相同(即不可能为别名分配替代名称)。

通配符有害

这种通配符导入很危险。其原因如上所述。用户不能对类型进行重命名。这样的结果是,在一个模型内进行两次或多次通配符导入可能产生命名冲突。再者,明确的导入(或直接使用全限定的类型)使得对于类型所关联定义的回溯与定位变得更为容易。而使用通配符则使这变得非常困难。原因是使用通配符后,导入类型和所在包的关系便不再清晰。