Application
- Object
- Once
- Application
- Once
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.
- #include "So-o.h"
- #include "Once.h"
- 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.
- void defclassApplication() {
- property _i_properties[] = {
- "appName",
- "app",
- 0
- };
- selector _i_messages[] = {
- "init", METHOD(i_init),
- "appName", METHOD(i_appName),
- "doesNotRecognize", METHOD(i_doesNotRecognize),
- 0, 0
- };
- Application = defclass("Application", Once, 1, 0, _i_properties, 0, _i_messages);
- }
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
- static instance i_init(instance self, va_list va) {
- char *appName = va_arg(va, char *);
- instance app = va_arg(va, instance);
- supersend(Application, self, "init");
- if (appName) {
- sendmsg(self, "set", "appName", appName);
- if (app)
- sendmsg(self, "set", "app", app);
- }
- return self;
- }
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
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
- static value i_doesNotRecognize(instance self, va_list va) {
- message msg = va_arg(va, message);
- instance app = sendmsg(self, "get", "app").p;
- if (!app)
- return supersend(Application, self, "doesNotRecognize", msg);
- return applymsg(app, msg, va_arg(va, va_list));
- }
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
- #include "So-o.h"
- #include "Application.h"
- #include "Hello.h"
- #include <stdlib.h>
- int main( int argc, char *argv[] ) {
- defclassHello();
- instance hello = (instance)sendmsg(Hello, "new").p;
- sendmsg(hello, "hello");
- defclassApplication();
- instance app=sendmsg(Application, "new", "Hello", hello).p;
- printf("%s\n", (char *)sendmsg(app, "appName").p);
- sendmsg(app, "hello");
- sendmsg(app, "set", "app", 0);
- sendmsg(app, "hello");
- exit( 0 );
- }
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
Commentaires