导入¶
正如我们前面所看到的,导入基本上有三种形式。在所有情况下,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
内总定义数目相等的别名。别名名称的唯一可能性就是和所导入包内定义的原名相同(即不可能为别名分配替代名称)。
通配符有害
这种通配符导入很危险。其原因如上所述。用户不能对类型进行重命名。这样的结果是,在一个模型内进行两次或多次通配符导入可能产生命名冲突。再者,明确的导入(或直接使用全限定的类型)使得对于类型所关联定义的回溯与定位变得更为容易。而使用通配符则使这变得非常困难。原因是使用通配符后,导入类型和所在包的关系便不再清晰。