Chapitre 5. Les objets avec URBI

Table des matières

Définir une classe
Méthodes virtuelles et attributs
Les groupes
La diffusion

La programmation orientée objet est intégrée à URBI, avec de nombreuses innovations comme les attributs virtuels et la diffusion (broadcasting). Ce chapitre aborde l'aspect le plus important des objets en URBI. Il peut être ignoré par les programmeurs débutants même si cela n'est en vérité guère compliqué et vraiment instructif.

Définir une classe

Tout comme en C++, on définit une classe en URBI avec le mot-clé class:

class maclasse;

Vous pouvez naturellement définir ce qui se trouvera dans la classe, c'est à dire des variables, des fonctions et des événements:

class maclasse {
  var x;
  var y;
  function f(a,b);
  event signalemoi(s);
};

Il est important de remarquer que, contrairement aux classes C++, maclasse dans l'exemple précédent est également une instance [4] et vous pouvez donc tout à fait affecter des valeurs à maclasse.x et l'utiliser.

Une fonction importante que vous souhaitez certainement définir est init, qui est le constructeur de la classe (ceci est une autre différence avec le C++, le constructeur n'est pas nommé avec le nom de la classe). Cette fonction ne devrait rien retourner ou retourner zéro pour indiquer la réussite de la création de l'instance et tout autre valeur pour indiquer son échec.

Pour définir le corps d'une méthode de classe, faites-le en dehors de la définition de classe, de la manière suivante:

class maclasse {
  var x;
  function init(a);
};

function maclasse.init(a) {
  x = a;
};

Vous pouvez définir une sous-classe (ou une instance, souvenez-vous qu'il n'y a aucune différence), avec une commande new, comme en C++:

masousclasse = new maclasse(42);

Cela va créer une sous-classe et appeler masousclasse.init(42);.

masousclasse hérite de maclasse, par conséquent tous les attributs et les méthodes de maclasse sont aussi disponibles dans masousclasse. Nous allons voir par la suite la question de la définition par défaut et celle de la redéfinition [5].

masousclasse peut hériter de plusieurs classes en appelant new sur ces différentes classes:

masousclasse = new maclasse (42);
masousclasse = new monautreclasse ();

C'est une façon assez spéciale de traiter l'héritage multiple, comparé au C++.

En appelant new sans parenthèse, avec juste le nom de la classe, on exécute le constructeur init sans paramètre:

masousclasse = new maclasse;
maclasse();

Si init n'est pas défini, ou si init retourne une valeur synonyme d'erreur (non vide et non nulle), un message d'erreur sera produit et la création avortée.

Les classes peuvent être complétées pendant l'exécution simplement en créant des fonctions ou des attributs se référant à elles. Exemple:

class maclasse {
  var x;
};
var maclasse.nouvelattribut;
maclasse.nouvelattribut = "salut";
...
function maclasse.f(a) {
  nouvelattribut = a;
};


[4] Cela s'appelle un langage orienté prototype, comme le javascript.

[5] Actuellement, il n'existe pas de notion d'accès privé, public ou protégé. Elles seront intégrées dans URBI 2.0.