假设我有一个通用的矢量库。为了更容易使用,我想实例化矢量库的各种常见形式,并使它们在单个包中可见。
我正在尝试这个:
with GenericVector;
package Vectors is
package Vectors3 is new GenericVector(3);
use all type Vectors3.Vector;
subtype Vector3 is Vectors3.Vector;
package Vectors4 is new GenericVector(4);
use all type Vectors4.Vector;
subtype Vector4 is Vectors4.Vector;
end;
最终目标是我希望能够执行with Vectors; use Vectors;
并最终获得直接可用的Vector3
和Vector4
类型的工作。
自然,上面的代码不起作用。看起来use all type
语句将附加到指定类型的定义导入到包规范中,但这些定义不会导出到Vectors
的用户。我必须改为with Vectors; use Vectors; use all type Vectors.Vectors3;
。这有点太糟糕了。
我该怎么做?
答案 0 :(得分:1)
您可以简单地制作Vector3
和Vector4
个新类型,而不仅仅是子类型。这将隐含地声明GenericVector
中Vectors
的所有继承的原始操作。
答案 1 :(得分:1)
use Vectors
可让您直接查看Vectors
中声明的标识符,包括隐式声明的标识符。 (隐式声明是"+"
,"-"
之类的东西,声明新整数类型时的运算符,以及声明派生类型时的继承操作。)但是它不会让你直接看到其他任何东西。特别是,use
不传递,因为use all type Vectors3.Vector
未在Vectors
中声明任何新标识符。
您可以通过声明为use Vectors
用户看到的所有内容重命名标识符来实现此目的。 (对于类型,您必须使用subtype
,因为在Ada中没有类型重命名。)例如。在Vectors
:
function Dot_Product (V1, V2 : Vectors3.Vector) return Float
renames Vectors3.Dot_Product;
(我只是猜测GenericVectors
中的操作可能是什么样子。)现在,任何说use Vectors
的地方都可以直接使用Dot_Product
。但是,您必须为每个标识符执行类似的操作。如果有很多,这可能不是一个可行的解决方案。 (重命名声明不必使用相同的名称Dot_Product
。)
虽然看起来很烦人,你无法获得这种传递性的可见性,但替代方案可能会变得更加烦人,因为你无法查看Vectors
并查看将制作哪些标识符use Vectors
可见;结果可能是意外的名称冲突或其他意外。