7

Object

La classe Object implémente les messages de base du modèle So-o. Toutes les autres classes héritent de la classe Object.

Tout le code de la classe Object de So-o est dans le fichier Object.c.

  1. #define InvalidClassProperty "%s::%s Invalid class property"
  2. #define InvalidInstanceProperty "%s::%s Invalid instance property"
  3. #define InvalidClassMessage "%s::%s Invalid class message"
  4. #define InvalidInstanceMessage "%s::%s Invalid instance message"
  5.  
  6. #define NotImplemented "%s::%s Not implemented"
  7. #define SubclassResponsibility "%s::%s Subclass responsibility"
  8.  
  9. #define InvalidArgument "%s::%s Invalid argument"

Définit les textes des messages d'erreurs retournés par la classe Object.

  1. class Object;
  2.  
  3. void defclassObject() {
  4.     selector _c_messages[] = {
  5.         "get",                      METHOD(c_get),
  6.         "set",                      METHOD(c_set),
  7.         "make",                     METHOD(c_make),
  8.         "new",                      METHOD(c_new),
  9.         "initialize",               METHOD(c_initialize),
  10.         "free",                     METHOD(c_free),
  11.         "class",                    METHOD(c_class),
  12.         "name",                     METHOD(c_name),
  13.         "revision",                 METHOD(c_revision),
  14.         "superclass",               METHOD(c_superclass),
  15.         "toString",                 METHOD(c_toString),
  16.         "error",                    METHOD(c_error),
  17.         "doesNotContain",           METHOD(c_doesNotContain),
  18.         "doesNotRecognize",         METHOD(c_doesNotRecognize),
  19.         "notImplemented",           METHOD(c_notImplemented),
  20.         "subclassResponsibility",   METHOD(c_subclassResponsibility),
  21.         "invalidArgument",          METHOD(c_invalidArgument),
  22.         "classMethodFor",           METHOD(c_classMethodFor),
  23.         "instanceMethodFor",        METHOD(c_instanceMethodFor),
  24.         "classMessages",            METHOD(c_classMessages),
  25.         "instanceMessages",         METHOD(c_instanceMessages),
  26.         "classProperties",          METHOD(c_classProperties),
  27.         "instanceProperties",       METHOD(c_instanceProperties),
  28.         "addClassMessage",          METHOD(c_addClassMessage),
  29.         "removeClassMessage",       METHOD(c_removeClassMessage),
  30.         "addInstanceMessage",       METHOD(c_addInstanceMessage),
  31.         "removeInstanceMessage",    METHOD(c_removeInstanceMessage),
  32.         "addClassProperty",         METHOD(c_addClassProperty),
  33.         "removeClassProperty",      METHOD(c_removeClassProperty),
  34.         "addInstanceProperty",      METHOD(c_addInstanceProperty),
  35.         "removeInstanceProperty",   METHOD(c_removeInstanceProperty),
  36.         0, 0
  37.     };
  38.  
  39.     selector _i_messages[] = {
  40.         "get",                      METHOD(i_get),
  41.         "set",                      METHOD(i_set),
  42.         "init",                     METHOD(i_init),
  43.         "free",                     METHOD(i_free),
  44.         "class",                    METHOD(i_class),
  45.         "superclass",               METHOD(i_superclass),
  46.         "toString",                 METHOD(i_toString),
  47.         "isKindOf",                 METHOD(i_isKindOf),
  48.         "respondsTo",               METHOD(i_respondsTo),
  49.         "methodFor",                METHOD(i_methodFor),
  50.         "delegate",                 METHOD(i_delegate),
  51.         "setDelegate",              METHOD(i_setDelegate),
  52.         "getDelegate",              METHOD(i_getDelegate),
  53.         "copy",                     METHOD(i_copy),
  54.         "assume",                   METHOD(i_assume),
  55.         "print",                    METHOD(i_print),
  56.         "error",                    METHOD(i_error),
  57.         "doesNotContain",           METHOD(i_doesNotContain),
  58.         "doesNotRecognize",         METHOD(i_doesNotRecognize),
  59.         "notImplemented",           METHOD(i_notImplemented),
  60.         "subclassResponsibility",   METHOD(i_subclassResponsibility),
  61.         "subclassResponsibility",   METHOD(i_subclassResponsibility),
  62.         "invalidArgument",          METHOD(i_invalidArgument),
  63.         "messages",                 METHOD(i_messages),
  64.         "properties",               METHOD(i_properties),
  65.         0, 0
  66.     };
  67.  
  68.     Object = class_new("Object", 0, 1, 0, 0, _c_messages, _i_messages);
  69. }

Définit la classe Object, une variable globale. defclassObject construit la classe Object et assigne l'adresse de son conteneur à la variable Object. NOTE : Si nécessaire, defclass appelle automatiquement defclassObject.

La classe Object est la seule classe qui n'hérite d'aucune superclasse. Elle n'a pas de propriétés de classe ou d'instance. Elle implémente tous les messages de base du modèle So-o.

MÉTHODES DE CLASSE

free
SYNOPSIS

void free(class self)

DESCRIPTION

free libére l'espace alloué par self, i.e. toutes les listes allouées par la classe et le conteneur de la classe.

IMPORTANT : free ne libère pas l'espace qui a pu être alloué pour les valeurs des attributs de la classe.

CODE
  1. static void c_free(class self) {
  2.     class_free(self);
  3. }

free appele class_free et ne retourne rien.

initialize
SYNOPSIS

class initialize(class self)

DESCRIPTION

initialize est automatiquement envoyé à une nouvelle classe par defclass. La méthode initialize définie par la classe Object ne fait rien.

initialize est généralement redéfini par une classe qui doit initialiser ses propriétés de classe.

CODE
  1. static class c_initialize (class self) {
  2.     return self;
  3. }

initialize ne fait rien et retourne self.

class
name
revision
superclass
SYNOPSIS

class class(class self)

char *name(class self)

int revision(class self)

class superclass(class self)

DESCRIPTION

class retourne la classe de la classe self, i.e. self.

name retourne le nom de la classe self.

revision retourne le numéro de révision de la classe self.

superclass retourne la superclasse de la classe self, NULL si self est Object, la classe Object.

CODE
  1. static class c_class(class self) {
  2.     return self;
  3. }
  4.  
  5. static const char* c_name(class self) {
  6.     return class_name(self);
  7. }
  8.  
  9. static unsigned int c_revision(class self) {
  10.     return class_revision(self);
  11. }
  12.  
  13. static class c_superclass(class self) {
  14.     return class_superclass(self);
  15. }

class retourne self. name, revision et superclass retournent le résultat des fonctions class_name, class_revision et class_superclass de l'Object Layer.

get
set
SYNOPSIS

value get(class self, property prop)

class set(class self, property prop, value val)

DESCRIPTION

get retourne la valeur de la propriété prop de self.

set met la valeur de la propriété prop de self à val.

CODE
  1. static value c_get(class self, va_list va) {
  2.     property prop = va_arg(va, property);
  3.  
  4.     return class_get(self, prop);
  5. }
  6.  
  7. static class c_set(class self, va_list va) {
  8.     property prop = va_arg(va, property);
  9.     value val = va_arg(va, value);
  10.  
  11.     return class_set(self, prop, val);
  12. }

get extrait le paramètre prop de la liste d'arguments va retourne le résultat de la functions class_get de l'Object Layer. set extrait les paramètres prop et val de la liste d'arguments va et appelle la fonction class_set de l'Object Layer qui retourne self.

make
new
SYNOPSIS

instance make(class self)

instance new(class self[, arg ...])

DESCRIPTION

make retourne une nouvelle instance de self.

new crée une instance de self, lui envoie le message init avec les paramètres du message suivant self et retourne la nouvelle instance initialisée.

IMPORTANT : Créez toujours une instance avec new.

CODE
  1. static instance c_make(class self) {
  2.     return class_make(self);
  3. }
  4.  
  5. static instance c_new(class self, va_list va) {
  6.     return (instance)object_send_message_va((instance)class_send_message(self, "make").p, "init", va).p;
  7. }

make retourne le résultat de la fonction class_make de l'Object Layer.

new crée une instance en envoyant make à self, lui envoie init avec les paramètres du message suivant self et retourne la nouvelle instance.

toString
SYNOPSIS

char *toString(class self)

DESCRIPTION

toString retourne le résultat de la fonction class_tostring de l'Object Layer qui retourne une représentation textuelle de self, i.e. le mot class suivi par le nom de la classe entre parenthèses. Cette méthode peut être redéfinie pour ajouter une représentation textuelle des attributs d'une classe.

IMPORTANT : La chaîne de caractères est formatée dans une zone statique. Il faut s'en servir avant de rappeler cette méthode.

CODE
  1. static char *c_toString(class self) {
  2.     return class_tostring(self);
  3. }

toString retourne le résultat de la fonction class_tostring de l'Object Layer.

addClassMessage
removeClassMessage
addInstanceMessage
removeInstanceMessage
SYNOPSIS

class addClassMessage(class self, message msg, method func)

class removeClassMessage(class self, message msg)

class addInstanceMessage(class self, message msg, method func)

class removeInstanceMessage(class self, message msg)

DESCRIPTION

addClassMessage ajoute le message de classe msg avec la méthode func à self.

removeClassMessage retire le message de classe msg de self.

addInstanceMessage ajoute le message d'instance msg avec la méthode func à self.

removeInstanceMessage retire le message d'instance msg de self.

CODE
  1. static class c_addClassMessage(class self, va_list va) {
  2.     message msg = va_arg(va, message);
  3.     method func = va_arg(va, method);
  4.  
  5.     return class_add_class_message(self, msg, func);
  6. }
  7.  
  8. static class c_removeClassMessage(class self, va_list va) {
  9.     message msg = va_arg(va, message);
  10.  
  11.     return class_remove_class_message(self, msg);
  12. }
  13.  
  14. static class c_addInstanceMessage(class self, va_list va) {
  15.     message msg = va_arg(va, message);
  16.     method func = va_arg(va, method);
  17.  
  18.     return class_add_instance_message(self, msg, func);
  19. }
  20.  
  21. static class c_removeInstanceMessage(class self, va_list va) {
  22.     message msg = va_arg(va, message);
  23.  
  24.     return class_remove_instance_message(self, msg);
  25. }

addClassMessage et addInstanceMessage extraient les paramètres msg et func de la liste d'arguments va et retournent le résultat des fonctions class_add_class_message et class_add_instance_message de l'Object Layer. removeClassMessage et removeInstanceMessage extrait le paramètre msg de la liste d'arguments va et retournent le résultat des fonctions class_remove_class_message et class_remove_instance_message de l'Object Layer.

addClassProperty
removeClassProperty
addInstanceProperty
removeInstanceProperty
SYNOPSIS

class addClassProperty(class self, property prop)

class removeClassProperty(class self, property prop)

class addInstanceProperty(class self, property prop)

class removeInstanceProperty(class self, property prop)

DESCRIPTION

addClassProperty ajoute la propriété de classe prop à self.

removeClassProperty retire la propriété de classe prop de self.

addInstanceProperty ajoute la propriété d'instance prop à self.

removeInstanceProperty retire la propriété d'instance prop de self.

CODE
  1. static class c_addClassProperty(class self, va_list va) {
  2.     property prop = va_arg(va, property);
  3.  
  4.     return class_add_class_property(self, prop);
  5. }
  6.  
  7. static class c_removeClassProperty(class self, va_list va) {
  8.     property prop = va_arg(va, property);
  9.  
  10.     return class_remove_class_property(self, prop);
  11. }
  12.  
  13. static class c_addInstanceProperty(class self, va_list va) {
  14.     property prop = va_arg(va, property);
  15.  
  16.     return class_add_instance_property(self, prop);
  17. }
  18.  
  19. static class c_removeInstanceProperty(class self, va_list va) {
  20.     property prop = va_arg(va, property);
  21.  
  22.     return class_remove_instance_property(self, prop);
  23. }

addClassProperty, removeClassProperty, addInstanceProperty et removeInstanceProperty extraient le paramètre prop de la liste d'arguments va et retournent le résultat des fonctions class_add_class_property, class_remove_class_property, class_add_instance_property et class_remove_instance_property de l'Object Layer.

error
doesNotContain
doesNotRecognize
notImplemented
subclassResponsibility
invalidArgument
SYNOPSIS

class error(class self, char *err[, arg ...])

class doesNotContain(class self, property prop)

class doesNotRecognize(class self, message msg)

class notImplemented(class self, message msg)

class subclassResponsibility(class self, message msg)

class invalidArgument(class self, message msg)

DESCRIPTION

error imprime un message sur le flux de sortie en erreur stderr. Le texte du message est formaté avec la fonction vprintf avec en argument err et les paramètres du message suivant err.

doesNotContain envoie le message error à self avec en argument la constante InvalidClassProperty, le nom de la classe self et la propriété prop.

doesNotRecognize envoie le message error à self avec en argument la constante InvalidClassMessage, le nom de la classe self et le message msg.

notImplemented envoie le message error à self avec en argument la constante NotImplemented, le nom de la classe self et le message msg.

subclassResponsibility envoie le message error à self avec en argument la constante SubclassResponsibility, le nom de la classe self et le message msg.

invalidArgument envoie le message error à self avec en argument la constante InvalidArgument, le nom de la classe self et le message msg.

doesNotContain et doesNotRecognize sont envoyés par l'Object Layer. notImplemented est généralement envoyé par une méthode qui n'est pas encore codée alors que subclassResponsibility est envoyé par une méthode qui doit être implémentée par une sous-classe d'une classe abstraite.

invalidArgument est envoyé par une méthode à qui a été passé un mauvais argument.

CODE
  1. static class c_error (class self, va_list va) {
  2.     const char *err = va_arg(va, char *);
  3.  
  4.     vfprintf(stderr, err, va);
  5.  
  6.     fprintf(stderr, "\n");
  7.  
  8.     return self;
  9. }
  10.  
  11. static class c_doesNotContain(class self, va_list va) {
  12.     message msg = va_arg(va, message);
  13.  
  14.     class_send_message(self, "error", InvalidClassProperty, class_name(self), msg);
  15.  
  16.     return self;
  17. }
  18.  
  19. static class c_doesNotRecognize(class self, va_list va) {
  20.     message msg = va_arg(va, message);
  21.  
  22.     class_send_message(self, "error", InvalidClassMessage, class_name(self), msg);
  23.  
  24.     return self;
  25. }
  26.  
  27. static class c_notImplemented(class self, va_list va) {
  28.     message msg = va_arg(va, message);
  29.  
  30.     class_send_message(self, "error", NotImplemented, class_name(self), msg);
  31.  
  32.     return self;
  33. }
  34.  
  35. static class c_subclassResponsibility(class self, va_list va) {
  36.     message msg = va_arg(va, message);
  37.  
  38.     class_send_message(self, "error", SubclassResponsibility, class_name(self), msg);
  39.  
  40.     return self;
  41. }
  42.  
  43. static class c_invalidArgument(class self, va_list va) {
  44.     message msg = va_arg(va, message);
  45.  
  46.     class_send_message(self, "error", InvalidArgument, class_name(self), msg);
  47.  
  48.     return self;
  49. }

error extrait le paramètre err de la liste d'arguments va et imprime le message d'erreur err formaté avec le reste des arguments suivant err avec vprintf puis imprime un renvoi à la ligne. doesNotContain, doesNotRecognize, notImplemented, subclassResponsibility et invalidArgument extraient le paramètre msg de la liste d'arguments va et envoient le message error à self avec en argument la constante du message d'erreur correspondant et ses paramètres.

classMethodFor
instanceMethodFor
SYNOPSIS

method classMethodFor(class self, message msg)

method instanceMethodFor(class self, message msg)

DESCRIPTION

classMethodFor retourne la fonction qui implémente le message de classe msg deself.

instanceMethodFor retourne la fonction qui implémente le message d'instance msg de self.

CODE
  1. static method c_classMethodFor(class self, va_list va) {
  2.     message msg = va_arg(va, message);
  3.  
  4.     return class_find_class_method(self, msg);
  5. }
  6.  
  7. static method c_instanceMethodFor(class self, va_list va) {
  8.     message msg = va_arg(va, message);
  9.  
  10.     return class_find_instance_method(self, msg);
  11. }

classMethodFor et instanceMethodFor extraient le paramètre msg de la liste d'arguments va et retournent le résultat des fonctions class_find_class_method et class_find_instance_method de l'Object Layer.

classMessages
instanceMessages
classProperties
instanceProperties
SYNOPSIS

message *classMessages(class self, int inherit)

message *instanceMessages(class self, int inherit)

property *classProperties(class self, int inherit)

property *instanceProperties(class self, int inherit)

DESCRIPTION

classMessages retourne les messages de classe de self dans un tableau terminé par un '\0'. Si inherit est différent de 0, classMessages retourne aussi les messages de classe hérités de toutes les superclasses de self.

instanceMessages retourne les messages d'instance de self dans un tableau terminé par un '\0'. Si inherit est différent de 0, instanceMessages retourne aussi les messages d'instance hérités de toutes les superclasses de self.

classProperties retourne les propriétés de classe de self dans un tableau terminé par un '\0'. Si inherit est différent de 0, classProperties retourne aussi les propriétés de classe héritées de toutes les superclasses de self.

instanceProperties retourne les propriétés d'instance de self dans un tableau terminé par un '\0'. Si inherit est différent de 0, instanceProperties retourne aussi les propriétés d'instance héritées de toutes les superclasses de self.

IMPORTANT : Le tableau retourné par ces fonctions est alloué et doit être libéré.

CODE
  1. static message *c_classMessages(class self, va_list va) {
  2.     int inherit = va_arg(va, int);
  3.  
  4.     alist ml = alist_new();
  5.     class c = self;
  6.  
  7.     do {
  8.         alist msglist = class_class_messages(c);
  9.  
  10.         if (msglist)
  11.             alist_merge(ml, msglist);
  12.  
  13.         if (!inherit)
  14.             break;
  15.  
  16.         c = class_superclass(c);
  17.     }
  18.     while (c);
  19.  
  20.     message *msgs = (message *)alist_keys(ml);
  21.  
  22.     alist_free(ml);
  23.  
  24.     return msgs;
  25. }
  26.  
  27. static message *c_instanceMessages(class self, va_list va) {
  28.     int inherit = va_arg(va, int);
  29.  
  30.     alist ml = alist_new();
  31.     class c = self;
  32.  
  33.     do {
  34.         alist msglist = class_instance_messages(c);
  35.  
  36.         if (msglist)
  37.             alist_merge(ml, msglist);
  38.  
  39.         if (!inherit)
  40.             break;
  41.  
  42.         c = class_superclass(c);
  43.     }
  44.     while (c);
  45.  
  46.     message *msgs = (message *)alist_keys(ml);
  47.  
  48.     alist_free(ml);
  49.  
  50.     return msgs;
  51. }

classMessages et instanceMessagees extraient le paramètre inherit de la liste d'arguments va. La liste associative ml sert à contenir temporairement tous les messages collectés. Elles poursuivent en fusionnant les message de classe ou d'instance de self dans ml, et, si inherit est différent de 0, tous les message de classe ou d'instance des superclasses de self. Elles retournent le tableau alloué par alist_keys avec ml en argument.

  1. static property *c_classProperties(class self, va_list va) {
  2.     int inherit = va_arg(va, int);
  3.  
  4.     list pl = list_new();
  5.     class c = self;
  6.  
  7.     do {
  8.         list proplist = class_class_properties(c);
  9.  
  10.         if (proplist)
  11.             list_merge(pl, proplist);
  12.  
  13.         if (!inherit)
  14.             break;
  15.  
  16.         c = class_superclass(c);
  17.     }
  18.     while (c);
  19.  
  20.     property *props = (property *)list_values(pl);
  21.  
  22.     list_free(pl);
  23.  
  24.     return props;
  25. }
  26.  
  27. static property *c_instanceProperties(class self, va_list va) {
  28.     int inherit = va_arg(va, int);
  29.  
  30.     list pl = list_new();
  31.     class c = self;
  32.  
  33.     do {
  34.         list proplist = class_instance_properties(c);
  35.  
  36.         if (proplist)
  37.             list_merge(pl, proplist);
  38.  
  39.         if (!inherit)
  40.             break;
  41.  
  42.         c = class_superclass(c);
  43.     }
  44.     while (c);
  45.  
  46.     property *props = (property *)list_values(pl);
  47.  
  48.     list_free(pl);
  49.  
  50.     return props;
  51. }

classProperties et instanceProperties extraient le paramètre inherit de la liste d'arguments va. La liste pl sert à contenir temporairement toutes les propriétés collectées. Elles poursuivent en fusionnant les message de classe ou d'instance de self dans pl, et, si inherit est différent de 0, toutes les propriétés de classe ou d'instance de self. Elles retournent le tableau alloué par list_values with pl en argument.

MÉTHODES D'INSTANCE

free
SYNOPSIS

void free(instance self)

DESCRIPTION

free libère l'espace alloué par self, i.e. la liste des attributs allouée par l'instance et le conteneur de l'instance.

IMPORTANT : free ne libère pas l'espace qui a pu être alloué pour les valeurs des attributs de l'instance.

CODE
  1. static void i_free(instance self) {
  2.     object_free(self);
  3. }

free appelle object_free et ne retourne rien.

init
SYNOPSIS

instance init(instance self[, arg ...])

DESCRIPTION

init est automatiquement envoyé à une nouvelle instance par new. La méthode init définie par la classe Object ne fait rien.

init est généralement redéfini par une classe qui doit initialiser ses propriétés d'instance.

CODE
  1. static instance i_init(instance self, va_list va) {
  2.     return self;
  3. }

init ne fait rien et retourne self.

class
superclass
SYNOPSIS

class class(instance self)

class superclass(instance self)

DESCRIPTION

class retourne la classe de self.

superclass retourne la superclasse de la classe de self, NULL si self est une instance de la classe Object.

CODE
  1. static class i_class(instance self) {
  2.     return object_class(self);
  3. }
  4.  
  5. static class i_superclass(instance self) {
  6.     return class_superclass(object_class(self));
  7. }

class retourne le résultat de la fonction object_class de l'Object Layer. superclass retourne le résultat de la fonction class_superclass avec en argument la classe de self.

assume
isKindOf
methodFor
respondsTo
SYNOPSIS

instance assume(instance self, class c)

int isKindOf(instance self, class c)

method methodFor(instance self, message msg)

int respondsTo(instance self,message msg)

DESCRIPTION

assume change la classe de self à c. Les valeurs des propriétés de la classe précédente de self qui ne font pas partie de la classe c sont conservées mais elles ne sont pas accessibles.

isKindOf retourne 1 si self est une instance de la classe ou d'une sous-classe de c ou 0 dans le cas contraire.

methodFor retourne la fonction qui implémente le message msg pour self ou NULL si self ne répond pas à msg.

respondsTo retourne 1 si self a une méthode pour le message msg, 0 dans le cas contraire.

CODE
  1. static instance i_assume(instance self, va_list va) {
  2.     class c = va_arg(va, class);
  3.  
  4.     return object_assume(self, c);
  5. }
  6.  
  7. static int i_isKindOf(instance self, va_list va) {
  8.     class c = va_arg(va, class);
  9.  
  10.     return class_is_kind_of(object_class(self), c);
  11. }
  12.  
  13. static method i_methodFor(instance self, va_list va) {
  14.     message msg = va_arg(va, message);
  15.  
  16.     return class_find_instance_method(object_class(self), msg);
  17. }
  18.  
  19. static int i_respondsTo(instance self, va_list va) {
  20.     return i_methodFor(self, va) ? 1 : 0;
  21. }

assume extrait la classe c de la liste d'arguments va et appelle la fonction object_assume de l'Object Layer avec c en argument. isKindOf extrait la classe c de la liste d'arguments va et retourne le résultat de la fonction class_is_kind_of de l'Object Layer avec en argument la classe de self et c. methodFor extrait le paramètre msg de la liste d'arguments va et retourne le résultat de la fonction class_find_instance_method de l'Object Layer avec en argument la classe de self et msg. respondsTo extrait le paramètre msg de la liste d'arguments va et retourne 1 si le résultat de la fonction class_find_instance_method de l'Object Layer avec en argument la classe de self et msg n'est pas NULL, 0 dans le cas contraire.

get
set
SYNOPSIS

value get(instance self, property prop)

instance set(instance self, property prop, value val)

DESCRIPTION

get retourne la valeur de la propriété prop de self.

set met la valeur de la propriété prop de self à val.

Si prop n'est pas une propriété de self, le message doesNotContain est envoyé à self avec prop en argument.

CODE
  1. static value i_get(instance self, va_list va) {
  2.     property prop = va_arg(va, property);
  3.  
  4.     return object_get(self, prop);
  5. }
  6.  
  7. static instance i_set(instance self, va_list va) {
  8.     property prop = va_arg(va, property);
  9.     value val = va_arg(va, value);
  10.  
  11.     return object_set(self, prop, val);
  12. }

get extrait le paramètre prop de la liste d'arguments va et retourne le résultat de la fonction object_get de l'Object Layer avec en argument prop.

set extrait les paramètres prop et val de la liste d'arguments va et retourne le résultat de la fonction object_set de l'Object Layer avec en argument prop et val.

copy
SYNOPSIS

instance copy(instance self)

DESCRIPTION

copy retourne une copie de self.

IMPORTANT : copy ne copie pas l'espace qui a pu être alloué pour les valeurs des attributs de l'instance.

CODE
  1. static instance i_copy(instance self) {
  2.     return object_copy(self);
  3. }

copy retourne le résultat de la fonction object_copy de l'Object Layer.

toString
SYNOPSIS

char *toString(instance self)

DESCRIPTION

toString retourne le résultat de la fonction object_tostring de l'Object Layer qui retourne une représentation textuelle de self, i.e. le mot object suivi par le nom de la classe entre parenthèses. Cette méthode peut être redéfinie pour ajouter une représentation textuelle des attributs d'une instance.

IMPORTANT : La chaîne de caractères est formatée dans une zone statique. Il faut s'en servir avant de rappeler cette méthode.

CODE
  1. static char *i_toString(instance self) {
  2.     return object_tostring(self);
  3. }

toString retourne le résultat de la fonction object_tostring de l'Object Layer.

print
SYNOPSIS

instance print(instance self, int eol)

DESCRIPTION

print écrit la représentation lisible de self sur la sortie standard. Si eol ne vaut pas 0, print ajoute un renvoi à la ligne.

  1. static instance i_print(instance self, va_list va) {
  2.     int eol = va_arg(va, int);
  3.  
  4.     printf("%s", (char *)object_send_message(self, "toString").p);
  5.  
  6.     if (eol)
  7.         printf("\n");
  8.  
  9.     return self;
  10. }

print extrait le paramètre eol de la liste d'arguments va, écrit le résultat de l'envoi du message toString à self sur la sortie standard et, si eol n'est pas 0, ajoute un renvoi à la ligne.

delegate
setDelegate
getDelegate
SYNOPSIS

value delegate(instance self, message msg[, arg ...])

instance setDelegate(instance self, instance delegate)

instance getDelegate(instance self)

DESCRIPTION

delegate retourne le résultat de l'envoi du message msg et des arguments arg suivant msg au délégué de self. Si self n'a pas de délégué ou si le délégué de self ne répond pas au message msg, delegate retourne 0.

setDelegate initialise la propriété delegate de self avec delegate.

getDelegate retourne le délégué de self.

NOTE : Envoyer delegate, setDelegate ou getDelegate à une instance qui n'a pas la propriété delegate envoie le message doesNotContain à l'instance.

CODE
  1. static value i_delegate(instance self, va_list va) {
  2.     instance delegate=object_get(self, "delegate").p;
  3.  
  4.     if (!delegate) {
  5.         return (value)0;
  6.     }
  7.  
  8.     message msg = va_arg(va, message);
  9.  
  10.     if (!object_send_message(delegate, "respondsTo", msg).i) {
  11.         return (value)0;
  12.     }
  13.  
  14.     return object_send_message_va(delegate, msg, va);
  15. }
  16.  
  17. static instance i_setDelegate(instance self, va_list va) {
  18.     instance delegate = va_arg(va, instance);
  19.  
  20.     return object_set(self, "delegate", (value)((void *)delegate));
  21. }
  22.  
  23. static instance i_getDelegate(instance self) {
  24.     return object_get(self, "delegate").p;
  25. }

delegate initialise delegate à la valeur de la propriété delegate de self. Si delegate vaut NULL, retourne 0. Extrait le paramètre msg de la liste d'arguments va. Si delegate ne répond pas à msg, retourne 0. Sinon, retourne le résultat de l'envoi de msg avec ses arguments à delegate.

setDelegate extrait le paramètre delegate de la liste d'arguments va et l'assigne à la propriété delegate de self. getDelegate retourne la valeur de propriété delegate de self .

error
doesNotContain
doesNotRecognize
notImplemented
subclassResponsibility
invalidArgument
SYNOPSIS

instance error(instance self, char *err[, arg ...])

instance doesNotContain(instance self, property prop)

instance doesNotRecognize(instance self, message msg)

instance notImplemented(instance self, message msg)

instance subclassResponsibility(instance self, message msg)

instance invalidArgument(instance self, message msg)

DESCRIPTION

error imprime un message sur le flux de sortie en erreur stderr. Le texte du message est formaté avec la fonction vprintf avec en argument err et les paramètres du message suivant err.

doesNotContain envoie le message error à self avec en argument la constante InvalidInstanceProperty, le nom de la classe de self et la propriété prop.

doesNotRecognize envoie le message error à self avec en argument la constante InvalidInstanceMessage, le nom de la classe de self et le message msg.

notImplemented envoie le message error à self avec en argument la constante NotImplemented, le nom de la classe de self et le message msg.

subclassResponsibility envoie le message error à self avec en argument la constante SubclassResponsibility, le nom de la classe de self et le message msg.

invalidArgument envoie le message error à self avec en argument la constante InvalidArgument, le nom de la classe de self et le message msg.

doesNotContain et doesNotRecognize sont envoyés par l'Object Layer. notImplemented est généralement envoyé par une méthode qui n'est pas encore codée alors que subclassResponsibility est envoyé par une méthode qui doit être implémentée par une sous-classe d'une classe abstraite.

invalidArgument est envoyé par une méthode à qui a été passé un mauvais argument.

CODE
  1. static instance i_error (instance self, va_list va) {
  2.     char *err = va_arg(va, char *);
  3.  
  4.     vfprintf(stderr, err, va);
  5.  
  6.     fprintf(stderr, "\n");
  7.  
  8.     return self;
  9. }
  10.  
  11. static instance i_doesNotContain(instance self, va_list va) {
  12.     message msg = va_arg(va, message);
  13.  
  14.     object_send_message(self, "error", InvalidInstanceProperty, class_name(object_class(self)), msg);
  15.  
  16.     return self;
  17. }
  18.  
  19. static instance i_doesNotRecognize(instance self, va_list va) {
  20.     message msg = va_arg(va, message);
  21.  
  22.     object_send_message(self, "error", InvalidInstanceMessage, class_name(object_class(self)), msg);
  23.  
  24.     return self;
  25. }
  26.  
  27. static instance i_notImplemented(instance self, va_list va) {
  28.     message msg = va_arg(va, message);
  29.  
  30.     object_send_message(self, "error", NotImplemented, class_name(object_class(self)), msg);
  31.  
  32.     return self;
  33. }
  34.  
  35. static instance i_subclassResponsibility(instance self, va_list va) {
  36.     message msg = va_arg(va, message);
  37.  
  38.     object_send_message(self, "error", SubclassResponsibility, class_name(object_class(self)), msg);
  39.  
  40.     return self;
  41. }
  42.  
  43. static instance i_invalidArgument(instance self, va_list va) {
  44.     message msg = va_arg(va, message);
  45.  
  46.     object_send_message(self, "error", InvalidArgument, class_name(object_class(self)), msg);
  47.  
  48.     return self;
  49. }

error extrait le paramètre err de la liste d'arguments va et imprime le message d'erreur err formaté avec le reste des arguments suivant err avec vprintf puis imprime un renvoi à la ligne.

doesNotContain, doesNotRecognize, notImplemented, subclassResponsibility et invalidArgument extraient le paramètre msg de la liste d'arguments va et envoient le message error à self avec en argument la constante du message d'erreur correspondant et ses paramètres.

messages
properties
SYNOPSIS

message *messages(instance self, int inherit)

property *properties(instance self, int inherit)

DESCRIPTION

messages retourne les messages reconnus par self dans un tableau terminé par un '\0'. Si inherit est différent de 0, messages retourne aussi les messages hérités de toutes les superclasses de self.

properties retourne les propriétés de self dans un tableau terminé par un '\0'. Si inherit est différent de 0, properties retourne aussi les propriétés héritées de toutes les superclasses de self.

IMPORTANT : Le tableau retourné par ces fonctions est alloué et doit être libéré.

CODE
  1. static message *i_messages(instance self, va_list va) {
  2.     return class_send_message_va(object_class(self), "instanceMessages", va).p;
  3. }
  4.  
  5. static property *i_properties(instance self, va_list va) {
  6.     return class_send_message_va(object_class(self), "instanceProperties", va).p;
  7. }

messages envoie le message instanceMessages à la classe de self avec inherit en argument. properties envoie le message instanceProperties à la classe de self avec inherit en argument.

VOIR AUSSI

Interface, Object Layer

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].