Packages et espaces de noms

Les packages et les espaces de noms sont des concepts associés. Les packages vous permettent de regrouper des définitions de classe de façon à faciliter le partage de code et à réduire les conflits de noms. Les espaces de noms vous permettent de contrôler la visibilité des identifiants (noms de méthode et de propriété, par exemple) et peuvent être appliqués à un code se trouvant à l’intérieur ou à l’extérieur d’un package. Utilisez des packages pour organiser vos fichiers de classe et des espaces de noms pour gérer la visibilité des méthodes et des propriétés individuelles.

Packages

Les packages dans ActionScript 3.0 sont implémentés avec des espaces de noms, mais ils ne sont pas synonymes. Lorsque vous déclarez un package, vous créez implicitement un type d’espace de noms spécial qui est sûr d’être connu lors de la compilation. Les espaces de noms, lorsque vous les créez explicitement, ne sont pas nécessairement connus au moment de la compilation.

L’exemple suivant utilise la directive package pour créer un simple package contenant une classe :

package samples 
{ 
    public class SampleCode 
    { 
        public var sampleGreeting:String; 
        public function sampleFunction() 
        { 
            trace(sampleGreeting + " from sampleFunction()"); 
        } 
    } 
}

Le nom de la classe dans cet exemple est SampleCode. Etant donné que la classe se trouve à l’intérieur du package samples, le compilateur qualifie automatiquement le nom de classe lors de la compilation sous la forme de son nom qualifié : samples.SampleCode. Le compilateur qualifie également les noms des propriétés ou des méthodes, de sorte que sampleGreeting et sampleFunction() deviennent respectivement samples.SampleCode.sampleGreeting et samples.SampleCode.sampleFunction().

Un grand nombre de développeurs (notamment ceux ayant une expérience de programmation Java) placent uniquement des classes au niveau supérieur d’un package. ActionScript 3.0, cependant, prend non seulement en charge des classes au niveau supérieur d’un package, mais également des variables, des fonctions et même des instructions. Une utilisation avancée de cette fonction consiste à définir un espace de noms au niveau supérieur d’un package de façon à ce que toutes les classes contenues dans ce dernier puissent l’utiliser. Il convient néanmoins de noter que seuls deux spécificateurs d’accès, public et internal, sont autorisés au niveau supérieur d’un package. Contrairement à Java qui permet de déclarer des classes imbriquées privées, ActionScript 3.0 ne prend en charge ni les classes imbriquées, ni les classes privées.

Néanmoins, les packages ActionScript 3.0 et les packages du langage de programmation Java présentent d’autres ressemblances. Comme vous pouvez l’observer dans l’exemple précédent, les références de package entièrement qualifiées sont exprimées à l’aide de l’opérateur point (.), comme dans Java. Vous pouvez utiliser des packages pour organiser votre code dans une structure hiérarchique intuitive que d’autres programmeurs peuvent utiliser. Ceci facilite le partage de code en vous permettant de créer votre propre package et de le partager avec d’autres personnes, et d’utiliser des packages créés par d’autres personnes dans votre code.

L’utilisation de packages vous permet également de vérifier que les noms d’identifiant que vous utilisez sont uniques et qu’ils ne sont pas incompatibles avec d’autres noms d’identifiant. Pour certaines personnes, il s’agit d’ailleurs de l’avantage principal des packages. Par exemple, deux programmeurs qui souhaitent partager leur code peuvent chacun avoir créé une classe appelée SampleCode. Sans packages, il y aurait un conflit de noms, et la seule façon de résoudre le problème serait de renommer l’une des classes. Mais avec des packages, vous pouvez éviter le conflit de noms en plaçant l’une des classes (ou de préférence les deux) dans des packages avec des noms uniques.

Vous pouvez également inclure des points intégrés dans le nom de votre package afin de créer des packages imbriqués. Ceci vous permet de créer une organisation hiérarchique des packages. Le package flash.display, fourni par ActionScript 3.0, en est un bon exemple. Il est imbriqué au sein du package flash.

La majeure partie d’ActionScript 3.0 se trouve dans le package flash. Par exemple, le package flash.display contient l’API de la liste d’affichage, et le package flash.events contient le nouveau modèle d’événement.

Création de packages

ActionScript 3.0 vous permet d’organiser vos packages, classes et fichiers source avec une grande souplesse. Les versions précédentes d’ActionScript autorisaient uniquement une classe par fichier source et exigeaient que le nom du fichier source corresponde au nom de la classe. ActionScript 3.0 vous permet d’inclure plusieurs classes dans un fichier source, mais une seule classe dans chaque fichier peut être utilisée par le code externe à ce fichier. En d’autres termes, une seule classe dans chaque fichier peut être déclarée à l’intérieur d’une déclaration de package. Vous devez déclarer toute classe supplémentaire à l’extérieur de votre définition de package. Elles sont alors invisibles pour le code externe à ce fichier source. Le nom de la classe déclarée à l’intérieur de la définition de package doit correspondre au nom du fichier source.

ActionScript 3.0 permet également de déclarer des packages avec davantage de flexibilité. Dans les versions précédentes d’ActionScript, les packages représentaient simplement des répertoires dans lesquels vous placiez des fichiers source, et vous ne déclariez pas les packages avec l’instruction package mais incluiez plutôt le nom du package dans le nom de classe complet dans votre déclaration de classe. Même si les packages continuent à représenter des répertoires dans ActionScript 3.0, leur contenu n’est pas limité aux seules classes. Dans ActionScript 3.0, vous utilisez l’instruction package pour déclarer un package, ce qui signifie que vous pouvez également déclarer des variables, des fonctions et des espaces de noms au niveau supérieur d’un package. Vous pouvez également y inclure des instructions exécutables. Si vous déclarez des variables, des fonctions ou des espaces de noms à ce niveau, les seuls attributs disponibles sont public et internal, et une seule déclaration au niveau du package par fichier peut utiliser l’attribut public, que cette déclaration soit une classe, une variable, une fonction ou un espace de noms.

Les packages sont utiles pour organiser votre code et éviter les conflits de noms. Vous ne devez pas confondre le concept de packages avec le concept distinct d’héritage de classe. Deux classes se trouvant dans un même package ont un espace de noms en commun mais elles ne sont pas nécessairement liées l’une à l’autre. De même, il se peut qu’un package imbriqué n’ait aucun lien sémantique avec son package parent.

Importation de packages

Si vous souhaitez utiliser une classe se trouvant à l’intérieur d’un package, vous devez importer soit le package soit la classe en question. Ceci diffère d’ActionScript 2.0 où l’importation de classes était facultative.

Par exemple, revenons à l’exemple de classe SampleCode présenté précédemment. Si la classe se trouve dans un package appelé samples, vous devez utiliser l’une des instructions d’importation suivantes avant d’utiliser la classe SampleCode :

import samples.*;

ou

import samples.SampleCode;

En général, les instructions import doivent être aussi spécifiques que possible. Si vous envisagez d’utiliser uniquement la classe SampleCode issue du package samples, importez uniquement la classe SampleCode au lieu du package entier auquel elle appartient. L’importation des packages entiers peut provoquer des conflits de noms inattendus.

Vous devez également placer le code source qui définit le package ou la classe dans votre chemin de classe. Le chemin de classe est une liste définie par l’utilisateur de chemins de répertoire locaux qui détermine l’endroit où le compilateur recherche des classes et des packages importés. Le chemin de classe est parfois appelé chemin de création ou chemin source.

Une fois que vous avez importé correctement la classe ou le package, vous pouvez utiliser le nom entièrement qualifié de la classe (samples.SampleCode) ou simplement le nom de la classe (SampleCode).

Les noms entièrement qualifiés sont utiles lorsque des classes, des méthodes ou des propriétés ayant le même nom génèrent un code ambigu mais ils peuvent être difficiles à gérer si vous les utilisez pour tous les identifiants. Par exemple, l’utilisation du nom entièrement qualifié génère un code détaillé lorsque vous instanciez une occurrence de classe SampleCode :

var mySample:samples.SampleCode = new samples.SampleCode();

Plus les niveaux de packages imbriqués augmentent, moins votre code est lisible. Lorsque vous pensez que des identifiants ambigus ne sont pas un problème, vous pouvez rendre votre code plus lisible en utilisant des identifiants simples. Par exemple, l’instanciation d’une nouvelle occurrence de la classe SampleCode est beaucoup moins longue si vous utilisez uniquement l’identifiant de classe :

var mySample:SampleCode = new SampleCode();

Si vous tentez d’utiliser des noms d’identifiant sans importer au préalable la classe ou le package approprié, il est impossible pour le compilateur de trouver les définitions de classe. En revanche, si vous importez un package ou une classe, toute tentative de définition d’un nom qui provoque un conflit avec un nom importé génère une erreur.

Lors de la création d’un package, le spécificateur d’accès par défaut pour tous les membres de ce package est internal, ce qui signifie que, par défaut, les membres du package ne sont visibles que pour d’autres membres de ce package. Si vous souhaitez qu’une classe soit disponible pour un code externe au package, vous devez la déclarer public. Par exemple, le package suivant contient deux classes, SampleCode et CodeFormatter :

// SampleCode.as file 
package samples 
{ 
    public class SampleCode {} 
} 
 
// CodeFormatter.as file 
package samples 
{ 
    class CodeFormatter {} 
}

La classe SampleCode est visible en dehors du package car elle est déclarée comme classe public. La classe CodeFormatter, cependant, est visible uniquement dans le package samples. Toute tentative d’accès à la classe CodeFormatter en dehors du package samples donne lieu à une erreur, comme l’indique l’exemple suivant :

import samples.SampleCode; 
import samples.CodeFormatter; 
var mySample:SampleCode = new SampleCode(); // okay, public class 
var myFormatter:CodeFormatter = new CodeFormatter(); // error

Si vous souhaitez que les deux classes soient disponibles en dehors du package, vous devez les déclarer public. Vous ne pouvez pas appliquer l’attribut public à la déclaration de package.

Les noms entièrement qualifiés sont utiles pour résoudre les conflits de noms pouvant se produire lors de l’utilisation de packages. Un tel scénario peut se produire si vous importez deux packages qui définissent des classes ayant le même identifiant. Par exemple, considérons le package suivant, qui possède également une classe appelée SampleCode :

package langref.samples 
{ 
    public class SampleCode {} 
}

Si vous importez les deux classes, comme suit, vous avez un conflit de noms lorsque vous utilisez la classe SampleCode :

import samples.SampleCode; 
import langref.samples.SampleCode; 
var mySample:SampleCode = new SampleCode(); // name conflict

Le compilateur n’a aucun moyen de savoir quelle classe SampleCode il doit utiliser. Pour résoudre ce conflit, vous devez utiliser le nom entièrement qualifié de chaque classe, comme suit :

var sample1:samples.SampleCode = new samples.SampleCode(); 
var sample2:langref.samples.SampleCode = new langref.samples.SampleCode();
Remarque : les programmeurs ayant une expérience C++ confondent souvent l’instruction import avec l’instruction #include. La directive #include est nécessaire dans C++ car les compilateurs C++ traitent un fichier à la fois et ne cherchent pas de définitions de classe dans d’autres fichiers, à moins qu’un fichier d’en-tête ne soit inclus explicitement. ActionScript 3.0 a une directive include, mais elle n’est pas conçue pour importer des classes et des packages. Pour importer des classes ou des packages dans ActionScript 3.0, vous devez utiliser l’instruction import et placer le fichier source qui contient le package dans le chemin de classe.

Espaces de noms

Les espaces de noms vous permettent de contrôler la visibilité des propriétés et des méthodes que vous créez. Considérez les spécificateurs de contrôle d’accès public, private, protected et internal comme des espaces de noms intégrés. Si ces spécificateurs de contrôle d’accès prédéfinis ne répondent pas à vos besoins, vous pouvez créer vos propres espaces de noms.

Si vous avez l’habitude d’utiliser des espaces de noms XML, cette section ne vous fournira pas de nouvelles informations, bien que la syntaxe et les détails de l’implémentation d’ActionScript soient légèrement différents de ceux d’XML. Si vous n’avez jamais travaillé avec des espaces de noms, le concept est simple, mais l’implémentation possède une terminologie particulière que vous devrez apprendre.

Pour comprendre comment fonctionnent les espaces de noms, il convient de savoir que le nom d’une propriété ou d’une méthode contient deux parties : un identifiant et un espace de noms. L’identifiant est ce que vous considérez généralement comme un nom. Par exemple, les identifiants dans la définition de classe suivante sont sampleGreeting et sampleFunction() :

class SampleCode 
{ 
    var sampleGreeting:String; 
    function sampleFunction () { 
        trace(sampleGreeting + " from sampleFunction()"); 
    } 
}

Lorsque les définitions ne sont pas précédées d’un attribut d’espace de noms, leurs noms sont qualifiés par l’espace de noms internal par défaut, ce qui signifie qu’ils sont visibles uniquement aux appelants du même package. Si le compilateur est défini sur le mode strict, il génère un avertissement indiquant que l’espace de noms internal s’applique à tout identifiant sans attribut d’espace de noms. Pour vérifier qu’un identifiant est disponible partout, vous devez spécifiquement faire précéder le nom de l’identifiant de l’attribut public. Dans l’exemple de code précédent, sampleGreeting et sampleFunction() ont une valeur d’espace de noms d’internal.

Vous devez suivre trois étapes de base lorsque vous utilisez des espaces de noms. Premièrement, vous devez définir l’espace de noms à l’aide du mot-clé namespace. Par exemple, le code suivant définit l’espace de noms version1 :

namespace version1;

Deuxièmement, vous appliquez votre espace de noms en l’utilisant à la place d’un spécificateur de contrôle d’accès dans une déclaration de méthode ou de propriété. L’exemple suivant place une fonction appelée myFunction() dans l’espace de noms version1 :

version1 function myFunction() {}

Troisièmement, une fois que vous avez appliqué l’espace de noms, vous pouvez le référencer à l’aide de la directive use ou en qualifiant le nom d’un identifiant avec un espace de nom. L’exemple suivant fait référence à la fonction myFunction() à l’aide de la directive use :

use namespace version1; 
myFunction();

Vous pouvez également utiliser un nom qualifié pour référencer la fonction myFunction(), comme l’indique l’exemple suivant :

version1::myFunction();

Définition des espaces de noms

Les espaces de noms contiennent une valeur, l’URI (Uniform Resource Identifier), parfois appelée nom d’espace de noms. Un URI vous permet de vérifier que votre définition d’espace de noms est unique.

Vous créez un espace de noms en déclarant sa définition de deux façons différentes. Vous pouvez soit définir un espace de noms avec un URI explicite, comme vous définiriez un espace de noms XML, soit omettre l’URI. L’exemple suivant indique comment un espace de noms peut être défini à l’aide d’un URI :

namespace flash_proxy = "http://www.adobe.com/flash/proxy";

L’URI sert de chaîne d’identification unique pour cet espace de noms. Si vous omettez l’URI, comme dans l’exemple suivant, le compilateur crée une chaîne d’identification interne unique à la place. Vous n’avez pas accès à cette chaîne d’identification interne.

namespace flash_proxy;

Une fois que vous avez défini un espace de noms (avec ou sans URI), vous ne pouvez pas le redéfinir dans le même domaine. Une tentative de définition d’un espace de noms ayant été défini dans le même domaine génère une erreur du compilateur.

Si un espace de noms est défini dans un package ou une classe, il risque de ne pas être visible au code externe à ce package ou à cette classe, à moins que vous n’utilisiez le spécificateur de contrôle d’accès approprié. Par exemple, le code suivant indique l’espace de noms flash_proxy défini dans le package flash.utils. Dans l’exemple suivant, l’absence de spécificateur de contrôle d’accès signifie que l’espace de noms flash_proxy est visible uniquement au code dans le package flash.utils et non au code externe au package :

package flash.utils 
{ 
    namespace flash_proxy; 
}

Le code suivant utilise l’attribut public pour rendre l’espace de noms flash_proxy visible au code externe au package :

package flash.utils 
{ 
    public namespace flash_proxy; 
}

Application d’espaces de noms

Appliquer un espace de noms signifie placer une définition dans un espace de noms. Les définitions que vous pouvez placer dans des espaces de noms peuvent être des fonctions, des variables et des constantes (vous ne pouvez pas placer une classe dans un espace de noms personnalisé).

Supposez, par exemple, qu’une fonction soit déclarée à l’aide de l’espace de noms de contrôle d’accès public. L’utilisation de l’attribut public dans une définition de fonction place la fonction dans l’espace de noms public et la rend visible à tout le code. Une fois que vous avez défini un espace de noms, vous pouvez l’utiliser de la même façon que l’attribut public, et la définition est disponible pour le code pouvant référencer votre espace de noms personnalisé. Par exemple, si vous définissez un espace de noms example1, vous pouvez ajouter une méthode appelée myFunction() à l’aide de example1 comme attribut, tel que l’indique l’exemple suivant :

namespace example1; 
class someClass 
{ 
    example1 myFunction() {} 
}

Déclarer la méthode myFunction() à l’aide de l’espace de noms example1 comme attribut signifie que la méthode appartient à l’espace de noms example1.

Tenez compte des points suivants lorsque vous appliquez des espaces de noms :

  • Vous pouvez appliquer un seul espace de noms à chaque déclaration.

  • Il n’existe aucun moyen d’appliquer un attribut d’espace de noms à plusieurs définitions simultanément. En d’autres termes, si vous souhaitez appliquer votre espace de noms à dix fonctions différentes, vous devez ajouter votre espace de noms comme attribut à chacune des dix définitions de fonction.

  • Si vous appliquez un espace de noms, vous ne pouvez pas spécifier un spécificateur de contrôle d’accès car les espaces de noms et les spécificateurs de contrôle d’accès s’excluent mutuellement. En d’autres termes, vous ne pouvez pas déclarer une fonction ou une propriété comme public, private, protected ou internal si vous appliquez votre espace de noms.

Référence d’espaces de noms

Il est inutile de référencer explicitement un espace de noms lorsque vous utilisez une méthode ou une propriété déclarée avec l’un des espaces de noms de contrôle d’accès (public, private, protected et internal, par exemple). En effet, l’accès à ces espaces de noms spéciaux dépend du contexte. Par exemple, les définitions placées dans l’espace de noms private sont automatiquement disponibles pour le code dans la même classe. Pour les espaces de noms que vous définissez, cependant, le contexte ne compte pas. Pour utiliser une méthode ou une propriété que vous avez placée dans un espace de noms personnalisé, vous devez référencer celui-ci.

Vous pouvez référencer des espaces de noms avec la directive use namespace ou qualifier le nom avec l’espace de noms à l’aide du ponctuateur de qualificatif de nom (::). Le fait de référencer un espace de noms avec la directive use namespace ouvre l’espace de noms, ce qui permet de l’appliquer à n’importe quel identifiant non qualifié. Par exemple, si vous avez défini l’espace de noms example1, vous pouvez accéder aux noms dans cet espace de noms en utilisant use namespace example1 :

use namespace example1; 
myFunction();

Vous pouvez ouvrir plusieurs espaces de noms simultanément. Une fois que vous avez ouvert un espace de noms avec use namespace, il reste ouvert dans le bloc de code dans lequel il a été ouvert. Il n’existe aucun moyen pour fermer explicitement un espace de noms.

Néanmoins, le fait d’avoir plusieurs espaces de noms ouverts augmente la probabilité que des conflits de noms se produisent. Si vous préférez ne pas ouvrir d’espace de noms, vous pouvez éviter la directive use namespace en qualifiant le nom de la propriété ou de la méthode avec l’espace de noms et le ponctuateur de qualificatif de nom. Par exemple, le code suivant indique comment vous pouvez qualifier le nom myFunction() avec l’espace de noms example1 :

example1::myFunction();

Utilisation d’espaces de noms

Vous pouvez trouver un exemple d’espace de noms, tiré du monde réel, utilisé pour éviter des conflits sur les noms dans la classe flash.utils.Proxy qui fait partie d’ActionScript 3.0. La classe Proxy, qui remplace la propriété Object.__resolve d’ActionScript 2.0, vous permet d’intercepter les références aux propriétés ou aux méthodes non définies avant qu’une erreur ne se produise. Toutes les méthodes de la classe Proxy se trouvent dans l’espace de noms flash_proxy afin d’empêcher les conflits de noms.

Pour mieux comprendre comment l’espace de noms flash_proxy est utilisé, vous devez savoir comment utiliser la classe Proxy. La fonctionnalité de la classe Proxy est disponible uniquement aux classes qui héritent d’elle. En d’autres termes, si vous souhaitez utiliser les méthodes de la classe Proxy d’un objet, la définition de classe de l’objet doit étendre la classe Proxy. Par exemple, si vous souhaitez intercepter des tentatives d’appel d’une méthode non définie, vous devez étendre la classe Proxy puis remplacer la méthode callProperty() de la classe Proxy.

L’implémentation des espaces de noms est généralement un processus en trois étapes (définition, application et référence d’un espace de noms). Etant donné que vous n’appelez jamais explicitement une méthode de la classe Proxy, cependant, l’espace de noms flash_proxy est défini et appliqué uniquement, jamais référencé. ActionScript 3.0 définit l’espace de noms flash_proxy et l’applique dans la classe Proxy. Votre code doit uniquement appliquer l’espace de noms flash_proxy à des classes qui étendent la classe Proxy.

L’espace de noms flash_proxy est défini dans le package flash.utils comme illustré ci-dessous :

package flash.utils 
{ 
    public namespace flash_proxy; 
}

L’espace de noms est appliqué aux méthodes de la classe Proxy comme indiqué dans l’extrait suivant issu de la classe Proxy :

public class Proxy 
{ 
    flash_proxy function callProperty(name:*, ... rest):* 
    flash_proxy function deleteProperty(name:*):Boolean 
    ... 
}

Comme l’indique le code suivant, vous devez d’abord importer la classe Proxy et l’espace de noms flash_proxy. Vous devez ensuite déclarer votre classe de façon à ce qu’elle étende la classe Proxy (vous devez également ajouter l’attribut dynamic si vous compilez en mode strict). Lorsque vous remplacez la méthode callProperty(), vous devez utiliser l’espace de noms flash_proxy.

package 
{ 
    import flash.utils.Proxy; 
    import flash.utils.flash_proxy; 
 
    dynamic class MyProxy extends Proxy 
    { 
        flash_proxy override function callProperty(name:*, ...rest):* 
        { 
            trace("method call intercepted: " + name); 
        } 
    } 
}

Si vous créez une occurrence de la classe MyProxy et appelez une méthode non définie (la méthode testing() appelée dans l’exemple suivant, par exemple), votre objet Proxy intercepte l’appel de méthode et exécute les instructions se trouvant dans la méthode callProperty() remplacée (dans ce cas, une instruction trace() simple).

var mySample:MyProxy = new MyProxy(); 
mySample.testing(); // method call intercepted: testing

Le fait que les méthodes de la classe Proxy se trouvent dans l’espace de noms flash_proxy présente deux avantages. Premièrement, le fait d’avoir un espace de noms séparé réduit l’encombrement dans l’interface publique des classes qui étendent la classe Proxy (iI existe environ douze méthodes dans la classe Proxy que vous pouvez remplacer. Elles ne sont pas conçues pour être appelées directement. Le fait de toutes les placer dans l’espace de noms public peut prêter à confusion). Deuxièmement, le fait d’utiliser l’espace de noms flash_proxy évite les conflits de nom si votre sous-classe Proxy contient des méthodes d’occurrence avec des noms correspondant à l’une des méthodes de la classe Proxy. Par exemple, vous pouvez nommer l’une de vos méthodes callProperty(). Le code suivant est acceptable car votre version de la méthode callProperty() se trouve dans un espace de noms différent :

dynamic class MyProxy extends Proxy 
{ 
    public function callProperty() {} 
    flash_proxy override function callProperty(name:*, ...rest):* 
    { 
        trace("method call intercepted: " + name); 
    } 
}

Vous pouvez également utiliser des espaces de noms pour accéder à des méthodes ou à des propriétés autrement qu’avec les quatre spécificateurs de contrôle d’accès (public, private, internal et protected). Par exemple, vous pouvez avoir des méthodes d’utilitaire éparpillées sur plusieurs packages. Vous souhaitez que ces méthodes soient disponibles pour tous vos packages, mais vous ne souhaitez pas qu’elles soient publiques. Pour cela, vous pouvez créer un espace de noms et l’utiliser comme spécificateur de contrôle d’accès spécial.

L’exemple suivant utilise un espace de noms défini par l’utilisateur pour regrouper deux fonctions se trouvant dans différents packages. En les regroupant dans le même espace de noms, vous pouvez rendre les deux fonctions visibles à une classe ou à un package au moyen d’une seule instruction use namespace.

Cet exemple utilise quatre fichiers pour démontrer la technique. Tous les fichiers doivent se trouver dans votre chemin de classe. Le premier fichier, myInternal.as, sert à définir l’espace de noms myInternal. Etant donné que le fichier se trouve dans un package appelé example, vous devez placer le fichier dans un dossier appelé example. L’espace de noms est marqué comme public pour pouvoir être importé dans d’autres packages.

// myInternal.as in folder example 
package example 
{ 
    public namespace myInternal = "http://www.adobe.com/2006/actionscript/examples"; 
}

Le deuxième et le troisième fichiers, Utility.as et Helper.as, définissent les classes qui contiennent des méthodes devant être disponibles pour d’autres packages. La classe Utility se trouve dans le package example.alpha, ce qui signifie que le fichier doit être placé dans un dossier appelé alpha qui est un sous-dossier du dossier example. La classe Helper se trouve dans le package example.beta, ce qui signifie que le fichier doit être placé dans un dossier appelé beta qui est également un sous-dossier du dossier example. Ces deux packages, example.alpha et example.beta, doivent importer l’espace de noms avant de l’utiliser.

// Utility.as in the example/alpha folder 
package example.alpha 
{ 
    import example.myInternal; 
     
    public class Utility 
    { 
        private static var _taskCounter:int = 0; 
     
        public static function someTask() 
        { 
            _taskCounter++; 
        } 
         
        myInternal static function get taskCounter():int 
        { 
            return _taskCounter; 
        } 
    } 
} 
 
// Helper.as in the example/beta folder 
package example.beta 
{ 
    import example.myInternal; 
     
    public class Helper 
    { 
        private static var _timeStamp:Date; 
         
        public static function someTask() 
        { 
            _timeStamp = new Date(); 
        } 
         
        myInternal static function get lastCalled():Date 
        { 
            return _timeStamp; 
        } 
    } 
}

Le quatrième fichier, NamespaceUseCase.as, est la classe de l’application principale et doit être un frère pour le dossier example. Dans Flash Professional, cette classe ferait office de classe de document du fichier FLA. La classe NamespaceUseCase importe également l’espace de noms myInternal et l’utilise pour appeler les deux méthodes statiques qui résident dans les autres packages. L’exemple utilise des méthodes statiques pour simplifier le code uniquement. Les méthodes statiques et d’occurrence peuvent être placées dans l’espace de noms myInternal.

// NamespaceUseCase.as 
package 
{ 
    import flash.display.MovieClip; 
    import example.myInternal; // import namespace 
    import example.alpha.Utility;// import Utility class 
    import example.beta.Helper;// import Helper class 
     
    public class NamespaceUseCase extends MovieClip 
    { 
        public function NamespaceUseCase() 
        { 
            use namespace myInternal; 
             
            Utility.someTask(); 
            Utility.someTask(); 
            trace(Utility.taskCounter); // 2 
             
            Helper.someTask(); 
            trace(Helper.lastCalled); // [time someTask() was last called] 
        } 
    } 
}