3

Application

  1. Object
    1. Once
      1. Application

Une classe Application n'a qu'une seule instance. Une instance d'Application peut avoir un nom. Elle peut être associée à un mandataire qui interprétera tous les messages qu'elle reçoit mais qu'elle n'implémente pas.

  1. #include "So-o.h"
  2.  
  3. #include "Once.h"
  4.  
  5. class Application;

Charge les déclarations des types de données et des fonctions de So-o. Charge les déclarations de la classe Once. Définit la classe Once.

  1. void defclassApplication() {
  2.     property _i_properties[] = {
  3.         "appName",
  4.         "app",
  5.         0
  6.     };
  7.     selector _i_messages[] = {
  8.         "init",             METHOD(i_init),
  9.         "appName",          METHOD(i_appName),
  10.         "doesNotRecognize", METHOD(i_doesNotRecognize),
  11.         0, 0
  12.     };
  13.  
  14.     Application = defclass("Application", Once, 1, 0, _i_properties, 0, _i_messages);
  15. }

Définit defclassApplication, le constructeur de la classe Application.

La classe Application hérite de la classe Once. Les propriétés d'instance appName et app contiennent le nom d'une instance d'Application et la référence de son mandataire. La classe Application redéfinit les messages d'instance init et doesNotRecognize. Elle ajoute le message d'instance appName.

MÉTHODES D'INSTANCE

init
SYNOPSIS

instance(instance self, char *appName, instance app)

DESCRIPTION

init initialise le nom et le mandataire de self avec appName et app.

CODE
  1. static instance i_init(instance self, va_list va) {
  2.     char *appName = va_arg(va, char *);
  3.     instance app = va_arg(va, instance);
  4.  
  5.     supersend(Application, self, "init");
  6.  
  7.     if (appName) {
  8.         sendmsg(self, "set", "appName", appName);
  9.         if (app)
  10.             sendmsg(self, "set", "app", app);
  11.     }
  12.  
  13.     return self;
  14. }

Extrait les paramètres appName et app de la liste d'arguments va. Execute la méthode init de la superclass de la classe Application. Initialise les propriétés d'instance appName si appName n'est pas NULL puis app si app n'est pas NULL.

appName
SYNOPSIS

char *appName(instance self)

DESCRIPTION

appName retourne le nom de self. Si self n'a pas de nom, appName retourne un NULL.

CODE
static char *i_appName(instance self) {
    return sendmsg(self, "get", "appName").p;
}

Retourne la propriété appName de self.

doesNotRecognize
SYNOPSIS

value doesNotRecognize(instance self, message msg)

DESCRIPTION

Une instance d'Application intercepte le message doesNotRecognize qui est automatiquement envoyé à une classe ou à une instance lorsqu'elle reçoit un message qu'elle n'implémente pas.

doesNotRecognize retourne le résultat du renvoi de msg et de ses paramètres au mandataire de self, l'instance qui a été passée en paramètre au message new à la création de self.

Si self n'a pas de mandataire, doesNotRecognize exécute le message doesNotRecognize dans le contexte de la superclasse de la classe Application, qui exécutera la méthode doesNotRecognize de la classe Object, qui déclenche une erreur.

CODE
  1. static value i_doesNotRecognize(instance self, va_list va) {
  2.     message msg = va_arg(va, message);
  3.  
  4.     instance app = sendmsg(self, "get", "app").p;
  5.  
  6.     if (!app)
  7.         return supersend(Application, self, "doesNotRecognize", msg);
  8.  
  9.     return applymsg(app, msg, va_arg(va, va_list));
  10. }

Extrait le paramètre msg de la liste d'arguments va. Initialise app à la valeur de la propriété app de self. Si app est NULL, retourne le résultat de l'exécution du message doesNotRecognize par la superclasse de la classe Application. Sinon, si self a un mandataire, retourne le résultat de l'envoi de msg et de ses paramètres à app.

EXEMPLE
  1. #include "So-o.h"
  2.  
  3. #include "Application.h"
  4. #include "Hello.h"
  5.  
  6. #include <stdlib.h>
  7.  
  8. int main( int argc, char *argv[] ) {
  9.     defclassHello();
  10.  
  11.     instance hello = (instance)sendmsg(Hello, "new").p;
  12.     sendmsg(hello, "hello");
  13.  
  14.     defclassApplication();
  15.  
  16.     instance app=sendmsg(Application, "new", "Hello", hello).p;
  17.     printf("%s\n", (char *)sendmsg(app, "appName").p);
  18.     sendmsg(app, "hello");
  19.  
  20.     sendmsg(app, "set", "app", 0);
  21.     sendmsg(app, "hello");
  22.  
  23.     exit( 0 );
  24. }

La classe Echo a un message d'instance, echo, qui affiche le texte passé en paramètre suivi d'un renvoi à la ligne.

Construit la classe Echo. Crée une instance d'Echo. Lui envoie le message echo avec la chaîne de caractères Adieu ! en argument. Construit la classe Application. Crée une instance d'Application appelée Echo avec l'instance d'Echo comme mandataire. Affiche le nom de l'application. Envoie le message echo avec la chaîne de caractères Adieu ! en argument à l'application. Le message est interprété par l'instance d'Echo. Envoie le message hello à l'application. Le mandataire affiche une message d'erreur. Retire le mandataire de l'application. Envoie le message echo à l'application. Le message déclenche une erreur.

$ gcc -I/usr/local/include/so-o -O -c test-Application.c
$ gcc test-Application.o -lso-o -o test-Application
$ test-Application 
Adieu !
Echo
Adieu !
Echo::hello Invalid instance message
Application::echo Invalid instance message
VOIR AUSSI

Once, Responder

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].