Université des Sciences et Technologies de Lille
Licence Miage - Programmation 1



Cours 4 : La déclaration de types privés et privés limités

Principe

Dans la conception d'un paquetage, on peut faire des choix de structures de données, auxquels on ne veut pas que l'utilisateur ait accès. Deux possibilités : Exemple : le paquetage binaire
Package Paq_Binaires is
   Max: Constant:=8;
   type Binaire is private;
   function Image(B:Binaire) return String;
   procedure Put(B:in Binaire);
   ...
private
   type Binaire is array(Positive range 1..Max) of Boolean;
end  Paq_Binaires;
La structure interne du type Binaire est cachée, et ne peut être utilisée au dehors du paquetage.

NB: Un type tableau non-contraint ne peut pas être privé, ni privé limité, car on ne pourrait pas contraindre les objets à la déclaration.

Comment marchent private et limited private ?

private : affectation et comparaison possibles + toutes les primitives du paquetages.

limited private : pas d'affectation, ni de comparaison.


Avantage

L'utilisation du paquetage ne dépend pas des choix d'implémentations pour les structures de données. En contre-partie, lors de la conception du paquetage, il faut veiller à fournir dans la spécification du paquetage suffisamment de fonctionnalités primitives, pour que l'utilisateur ne soit pas limité par l'interdiction d'accès au type. Par exemple, on ne peut pas accèder à l'octet i d'un nombre binaire: B(i) est prohibé. Le paquetage doit donc implanter une fonction spécifique.

function Octet(B:Binaire;I:Positive range 0..max) return Natural is
begin
  return Boolean'pos(B(i));
end Octet;
Les constantes
Les constantes d'un type privé ou privé limité ne peuvent pas être définies dans la partie publique de la spécification, puisque à ce niveau les détails du type ne sont pas connus.

Package Paq_Binaire is
  type Binaire is private;
  Zero: constant Binaire :=(others=>0);
  ...
end Paq_Binaire;
n'est pas autorisé. La définition doit se faire en deux temps : la constante est annoncée dans la partie publique, puis définie dans la partie privée.

   type Binaire is private;
   Zero: constant Binaire;
   ...
private
   type Binaire is array(Positive range 1..Max) of Boolean;
   Zero: constant Binaire := (others => false);