7.1 概述(Overview)
多子程序封装在一个文件里过于庞大,且分类不清,这时就使用了程序包(package),作为一种分组机制,将子程序归类封装成独立的单元。Ada 的程序包机制主要受 Pascal 及 70 年代时的软件工程技术影响。当时很主要的一项革新就是软件包的概念。软件包使一个大程序分离成了多个单元,使软件维护更加方便,可重用性也更高,是结构化编程思想中必不可少的一部份。
软件包并不关心程序是如何运行的,而是在于理解程序是如何构成的以及维护性。Ada 的程序包是定义一堆相关实体(如数据类型、运算符、子程序)的最基本单元,也是使用最常用的编译单元之一。本章里我们介绍程序包的常见用法,更多的内容,如类属程序包,请参见后面的章节。
7.2 程序包的声明(Package Declaration)
程序包一般分为两部份,声明部分和执行部份。声明部份声明子程序、变量等实体,他们通常被称为资源;而执行部份则是声明部分中实体的实现。它们的扩展名一般情况下分别为 ads 和 adb。为了省力点,我们就直接将上一章的overload 做个处理,将"+"和Put封装在程序包内,这样程序包说明如下:
000 --filename:overload.ads
001 package Overload is
002 type Vector is array (1 .. 5 ) of Integer;
003 function "+"(left,right:Vector) return Vector;
004 procedure Put (Item : Vector);
005 end Overload;
从这个例子,我们应该知道了程序包说明的格式:
package packgae_name is
statements;
end package_name;
statemets就是数据类型、变量、常量、子程序的声明。
7.3 程序包的主体部份(Package Body)
仅仅有说明部份,程序包还没什么用处,还要有它的主体部份,即说明部份的具体实现。主体部份可以包含创建数据类型、子程序、变量、常量。它的格式为:
package body packgae_name is
statements1;
[begin]
statements2;
end package_name;
statements1 是创建子程序、数据类型、变量、常量的语句,一般情况下是说明部份的具体实现;**[begin]**是可选的,它后面的statement2 是程序包的初始化语句,在主程序执行前开始执行。
所以上例 overload 的主体部分为:
000 -- filename:overload.adb
001 with Ada.Integer_Text_IO; use Ada.Integer_text_IO;
002 package body Overload is
003 function "+"(left,right:Vector) return Vector is
004 result : Vector;
005 begin
006 for i in left'range loop
007