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.
- #define InvalidClassProperty "%s::%s Invalid class property"
- #define InvalidInstanceProperty "%s::%s Invalid instance property"
- #define InvalidClassMessage "%s::%s Invalid class message"
- #define InvalidInstanceMessage "%s::%s Invalid instance message"
- #define NotImplemented "%s::%s Not implemented"
- #define SubclassResponsibility "%s::%s Subclass responsibility"
- #define InvalidArgument "%s::%s Invalid argument"
Définit les textes des messages d'erreurs retournés par la classe Object.
- class Object;
- void defclassObject() {
- selector _c_messages[] = {
- "get", METHOD(c_get),
- "set", METHOD(c_set),
- "make", METHOD(c_make),
- "new", METHOD(c_new),
- "initialize", METHOD(c_initialize),
- "free", METHOD(c_free),
- "class", METHOD(c_class),
- "name", METHOD(c_name),
- "revision", METHOD(c_revision),
- "superclass", METHOD(c_superclass),
- "toString", METHOD(c_toString),
- "error", METHOD(c_error),
- "doesNotContain", METHOD(c_doesNotContain),
- "doesNotRecognize", METHOD(c_doesNotRecognize),
- "notImplemented", METHOD(c_notImplemented),
- "subclassResponsibility", METHOD(c_subclassResponsibility),
- "invalidArgument", METHOD(c_invalidArgument),
- "classMethodFor", METHOD(c_classMethodFor),
- "instanceMethodFor", METHOD(c_instanceMethodFor),
- "classMessages", METHOD(c_classMessages),
- "instanceMessages", METHOD(c_instanceMessages),
- "classProperties", METHOD(c_classProperties),
- "instanceProperties", METHOD(c_instanceProperties),
- "addClassMessage", METHOD(c_addClassMessage),
- "removeClassMessage", METHOD(c_removeClassMessage),
- "addInstanceMessage", METHOD(c_addInstanceMessage),
- "removeInstanceMessage", METHOD(c_removeInstanceMessage),
- "addClassProperty", METHOD(c_addClassProperty),
- "removeClassProperty", METHOD(c_removeClassProperty),
- "addInstanceProperty", METHOD(c_addInstanceProperty),
- "removeInstanceProperty", METHOD(c_removeInstanceProperty),
- 0, 0
- };
- selector _i_messages[] = {
- "get", METHOD(i_get),
- "set", METHOD(i_set),
- "init", METHOD(i_init),
- "free", METHOD(i_free),
- "class", METHOD(i_class),
- "superclass", METHOD(i_superclass),
- "toString", METHOD(i_toString),
- "isKindOf", METHOD(i_isKindOf),
- "respondsTo", METHOD(i_respondsTo),
- "methodFor", METHOD(i_methodFor),
- "delegate", METHOD(i_delegate),
- "setDelegate", METHOD(i_setDelegate),
- "getDelegate", METHOD(i_getDelegate),
- "copy", METHOD(i_copy),
- "assume", METHOD(i_assume),
- "print", METHOD(i_print),
- "error", METHOD(i_error),
- "doesNotContain", METHOD(i_doesNotContain),
- "doesNotRecognize", METHOD(i_doesNotRecognize),
- "notImplemented", METHOD(i_notImplemented),
- "subclassResponsibility", METHOD(i_subclassResponsibility),
- "subclassResponsibility", METHOD(i_subclassResponsibility),
- "invalidArgument", METHOD(i_invalidArgument),
- "messages", METHOD(i_messages),
- "properties", METHOD(i_properties),
- 0, 0
- };
- Object = class_new("Object", 0, 1, 0, 0, _c_messages, _i_messages);
- }
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
- static void c_free(class self) {
- class_free(self);
- }
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
- static class c_initialize (class self) {
- return self;
- }
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
- static class c_class(class self) {
- return self;
- }
- static const char* c_name(class self) {
- return class_name(self);
- }
- static unsigned int c_revision(class self) {
- return class_revision(self);
- }
- static class c_superclass(class self) {
- return class_superclass(self);
- }
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
- static value c_get(class self, va_list va) {
- property prop = va_arg(va, property);
- return class_get(self, prop);
- }
- static class c_set(class self, va_list va) {
- property prop = va_arg(va, property);
- value val = va_arg(va, value);
- return class_set(self, prop, val);
- }
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
- static instance c_make(class self) {
- return class_make(self);
- }
- static instance c_new(class self, va_list va) {
- return (instance)object_send_message_va((instance)class_send_message(self, "make").p, "init", va).p;
- }
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
- static char *c_toString(class self) {
- return class_tostring(self);
- }
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
- static class c_addClassMessage(class self, va_list va) {
- message msg = va_arg(va, message);
- method func = va_arg(va, method);
- return class_add_class_message(self, msg, func);
- }
- static class c_removeClassMessage(class self, va_list va) {
- message msg = va_arg(va, message);
- return class_remove_class_message(self, msg);
- }
- static class c_addInstanceMessage(class self, va_list va) {
- message msg = va_arg(va, message);
- method func = va_arg(va, method);
- return class_add_instance_message(self, msg, func);
- }
- static class c_removeInstanceMessage(class self, va_list va) {
- message msg = va_arg(va, message);
- return class_remove_instance_message(self, msg);
- }
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
- static class c_addClassProperty(class self, va_list va) {
- property prop = va_arg(va, property);
- return class_add_class_property(self, prop);
- }
- static class c_removeClassProperty(class self, va_list va) {
- property prop = va_arg(va, property);
- return class_remove_class_property(self, prop);
- }
- static class c_addInstanceProperty(class self, va_list va) {
- property prop = va_arg(va, property);
- return class_add_instance_property(self, prop);
- }
- static class c_removeInstanceProperty(class self, va_list va) {
- property prop = va_arg(va, property);
- return class_remove_instance_property(self, prop);
- }
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
- static class c_error (class self, va_list va) {
- const char *err = va_arg(va, char *);
- vfprintf(stderr, err, va);
- fprintf(stderr, "\n");
- return self;
- }
- static class c_doesNotContain(class self, va_list va) {
- message msg = va_arg(va, message);
- class_send_message(self, "error", InvalidClassProperty, class_name(self), msg);
- return self;
- }
- static class c_doesNotRecognize(class self, va_list va) {
- message msg = va_arg(va, message);
- class_send_message(self, "error", InvalidClassMessage, class_name(self), msg);
- return self;
- }
- static class c_notImplemented(class self, va_list va) {
- message msg = va_arg(va, message);
- class_send_message(self, "error", NotImplemented, class_name(self), msg);
- return self;
- }
- static class c_subclassResponsibility(class self, va_list va) {
- message msg = va_arg(va, message);
- class_send_message(self, "error", SubclassResponsibility, class_name(self), msg);
- return self;
- }
- static class c_invalidArgument(class self, va_list va) {
- message msg = va_arg(va, message);
- class_send_message(self, "error", InvalidArgument, class_name(self), msg);
- return self;
- }
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
- static method c_classMethodFor(class self, va_list va) {
- message msg = va_arg(va, message);
- return class_find_class_method(self, msg);
- }
- static method c_instanceMethodFor(class self, va_list va) {
- message msg = va_arg(va, message);
- return class_find_instance_method(self, msg);
- }
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
- static message *c_classMessages(class self, va_list va) {
- int inherit = va_arg(va, int);
- alist ml = alist_new();
- class c = self;
- do {
- alist msglist = class_class_messages(c);
- if (msglist)
- alist_merge(ml, msglist);
- if (!inherit)
- break;
- c = class_superclass(c);
- }
- while (c);
- message *msgs = (message *)alist_keys(ml);
- alist_free(ml);
- return msgs;
- }
- static message *c_instanceMessages(class self, va_list va) {
- int inherit = va_arg(va, int);
- alist ml = alist_new();
- class c = self;
- do {
- alist msglist = class_instance_messages(c);
- if (msglist)
- alist_merge(ml, msglist);
- if (!inherit)
- break;
- c = class_superclass(c);
- }
- while (c);
- message *msgs = (message *)alist_keys(ml);
- alist_free(ml);
- return msgs;
- }
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.
- static property *c_classProperties(class self, va_list va) {
- int inherit = va_arg(va, int);
- list pl = list_new();
- class c = self;
- do {
- list proplist = class_class_properties(c);
- if (proplist)
- list_merge(pl, proplist);
- if (!inherit)
- break;
- c = class_superclass(c);
- }
- while (c);
- property *props = (property *)list_values(pl);
- list_free(pl);
- return props;
- }
- static property *c_instanceProperties(class self, va_list va) {
- int inherit = va_arg(va, int);
- list pl = list_new();
- class c = self;
- do {
- list proplist = class_instance_properties(c);
- if (proplist)
- list_merge(pl, proplist);
- if (!inherit)
- break;
- c = class_superclass(c);
- }
- while (c);
- property *props = (property *)list_values(pl);
- list_free(pl);
- return props;
- }
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
- static void i_free(instance self) {
- object_free(self);
- }
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
- static instance i_init(instance self, va_list va) {
- return self;
- }
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
- static class i_class(instance self) {
- return object_class(self);
- }
- static class i_superclass(instance self) {
- return class_superclass(object_class(self));
- }
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
- static instance i_assume(instance self, va_list va) {
- class c = va_arg(va, class);
- return object_assume(self, c);
- }
- static int i_isKindOf(instance self, va_list va) {
- class c = va_arg(va, class);
- return class_is_kind_of(object_class(self), c);
- }
- static method i_methodFor(instance self, va_list va) {
- message msg = va_arg(va, message);
- return class_find_instance_method(object_class(self), msg);
- }
- static int i_respondsTo(instance self, va_list va) {
- return i_methodFor(self, va) ? 1 : 0;
- }
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
- static value i_get(instance self, va_list va) {
- property prop = va_arg(va, property);
- return object_get(self, prop);
- }
- static instance i_set(instance self, va_list va) {
- property prop = va_arg(va, property);
- value val = va_arg(va, value);
- return object_set(self, prop, val);
- }
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
- static instance i_copy(instance self) {
- return object_copy(self);
- }
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
- static char *i_toString(instance self) {
- return object_tostring(self);
- }
toString
retourne le résultat de la fonction object_tostring
de l'Object Layer.
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.
- static instance i_print(instance self, va_list va) {
- int eol = va_arg(va, int);
- printf("%s", (char *)object_send_message(self, "toString").p);
- if (eol)
- printf("\n");
- return self;
- }
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
- static value i_delegate(instance self, va_list va) {
- instance delegate=object_get(self, "delegate").p;
- if (!delegate) {
- return (value)0;
- }
- message msg = va_arg(va, message);
- if (!object_send_message(delegate, "respondsTo", msg).i) {
- return (value)0;
- }
- return object_send_message_va(delegate, msg, va);
- }
- static instance i_setDelegate(instance self, va_list va) {
- instance delegate = va_arg(va, instance);
- return object_set(self, "delegate", (value)((void *)delegate));
- }
- static instance i_getDelegate(instance self) {
- return object_get(self, "delegate").p;
- }
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
- static instance i_error (instance self, va_list va) {
- char *err = va_arg(va, char *);
- vfprintf(stderr, err, va);
- fprintf(stderr, "\n");
- return self;
- }
- static instance i_doesNotContain(instance self, va_list va) {
- message msg = va_arg(va, message);
- object_send_message(self, "error", InvalidInstanceProperty, class_name(object_class(self)), msg);
- return self;
- }
- static instance i_doesNotRecognize(instance self, va_list va) {
- message msg = va_arg(va, message);
- object_send_message(self, "error", InvalidInstanceMessage, class_name(object_class(self)), msg);
- return self;
- }
- static instance i_notImplemented(instance self, va_list va) {
- message msg = va_arg(va, message);
- object_send_message(self, "error", NotImplemented, class_name(object_class(self)), msg);
- return self;
- }
- static instance i_subclassResponsibility(instance self, va_list va) {
- message msg = va_arg(va, message);
- object_send_message(self, "error", SubclassResponsibility, class_name(object_class(self)), msg);
- return self;
- }
- static instance i_invalidArgument(instance self, va_list va) {
- message msg = va_arg(va, message);
- object_send_message(self, "error", InvalidArgument, class_name(object_class(self)), msg);
- return self;
- }
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
- static message *i_messages(instance self, va_list va) {
- return class_send_message_va(object_class(self), "instanceMessages", va).p;
- }
- static property *i_properties(instance self, va_list va) {
- return class_send_message_va(object_class(self), "instanceProperties", va).p;
- }
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.
Commentaires