Implémenter l’étendue et les identificateurs d’accès X++
L’étendue est la zone où un élément se trouve ou est accessible. Les variables et les méthodes X++ se trouvent dans une étendue définie. L’étendue peut être définie par l’emplacement de déclaration et l’utilisation d’identificateurs d’accès.
Les identificateurs d’accès sont [public], [protected] et [private].
- Public : les méthodes déclarées comme étant publiques peuvent être appelées partout où la classe est accessible. En outre, une méthode publique peut être remplacée par une sous-classe sauf si la méthode est déclarée comme finale.
- Protégé : les méthodes protégées peuvent être remplacées dans les sous-classes. Les méthodes déclarées comme étant protégées ne peuvent être appelées qu’à partir de :
- Méthodes de la classe
- Méthodes d’une sous-classe de la classe contenant la méthode protégée
- Privé : les méthodes déclarées comme étant privées ne peuvent être appelées qu’à partir des méthodes de la classe où la méthode privée est déclarée. Aucune méthode privée ne peut être remplacée dans une sous-classe. Lorsque vous créez une méthode, le mot clé d’accesseur par défaut qui s’affiche dans l’éditeur de code est privé. Privé est la valeur par défaut la plus conservatrice pour garantir une sécurité maximale.
Interne
Interne est un mot clé dans X++. Il a la même sémantique que dans C#. Consultez Interne (référence C#).
Lorsque vous sélectionnez une classe ou une méthode comme interne, elle n’est accessible qu’à partir du modèle où elle est définie.
internal class MyInternalClass
{
internal void myInternalMethod()
{
}
}
Notez que vous pouvez aussi définir des méthodes internes sur des classes publiques.
Variables d’instance
Les variables d’instance ont une grande étendue et sont également appelées champs de classe dans X++. Ces variables sont déclarées dans la déclaration de classe et sont accessibles à partir de n’importe quelle méthode de la classe et des sous-classes qui étendent la classe, si elles sont déclarées comme étant publiques ou protégées.
Variables locales
Les variables locales ont une faible étendue. Ces variables sont définies dans une méthode et ne sont accessibles que dans cette méthode.
Les paramètres sont un type de variable locale définie sur une méthode.
Pour utiliser une variable d’une étendue à une autre, la variable doit être transmise à l’aide de paramètres. Les méthodes peuvent utiliser plusieurs paramètres. Les paramètres sont considérés comme des variables locales et sont initialisés avec la valeur du paramètre dans l’appel de méthode. Dans l’exemple suivant, la méthode de classe a deux paramètres qui donnent à method1 l’accès à quatre variables. Les variables d’instance a et b sont accessibles et les paramètres x et y agissent comme des variables locales. L’utilisation de paramètres permet d’affecter des valeurs à ces paramètres lors de l’appel de la méthode. Si method1 est appelé en utilisant le code Test.method1(a,b);, la valeur Car est affectée à la variable x et la valeur 20 à la variable y. Vous pouvez ensuite utiliser les valeurs des variables de paramètre pour affecter des valeurs aux variables d’instance c et d.
class Test
{
str a = "Car";
int b = 20;
str c;
int d;
void method1(str x, int y)
{
c = x;
d = y;
}
}
Gardez à l’esprit que lorsque vous transmettez une valeur au moyen des paramètres, vous ne modifiez pas par défaut la valeur de la variable d’origine. On parle alors d’« appel par valeur » par opposition à « appel par référence ». Seule la variable locale est modifiée.
Exemple
Dans l’exemple suivant, method2 a une variable locale a dont la valeur est 5. La première instruction info() affiche la valeur de a, qui est 5. Elle appelle method1 et transmet la valeur de sa variable locale a. Method1 a maintenant une variable locale a différente, dont la valeur est 5. Method1 incrémente ensuite la valeur de 1, ce qui donne à a la valeur 2. L’instruction info() affiche alors la valeur 2. Le code retourne à method2 et exécute la deuxième instruction info(). La valeur 5 s’affiche. Ce résultat s’explique par le fait que même si le nom de la variable est le même, l’étendue est propre à ses méthodes respectives.
class infoValue
{
void method1(int a)
{
a = 1;
a = a ++;
info(int2str(a));
}
void method2()
{
int a = 5;
info(int2str(a));
this.method1(a);
info(int2str(a));
}
}
L’image suivante illustre comment la méthode info s’affiche dans l’interface utilisateur.
