Root
La classe Root implémente les messages de base du modèle So-o. Toutes les autres classes héritent de la classe Root.
Tout le code de la classe Root de So-o est dans le fichier Root.js.
- import { defclass } from 'So-o';
- import * as OL from 'OL';
Importe la fonction defclass
de So-o et toutes les fonctions définies par l'Object Layer.
- defclass('Root',
- // superclass
- null,
- // revision
- 1,
- // class properties
- null,
- // instance properties
- null,
La classe Root 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
get
set
SYNOPSIS
get(self, attr)
set(self, attr, val)
DESCRIPTION
get
retourne la valeur de la propriété attr
de self
.
set
met la valeur de la propriété attr
de self
à val
.
IMPORTANT : Copiez le contenu d'un attribut qui est un tableau ou un objet si vous voulez le modifier sans changer la valeur de l'attribut.
CODE
- { 'get': (self, attr) => OL.class_get(self, attr),
- 'set': (self, attr, val) => OL.class_set(self, attr, val),
get
et set
retournent le résultat des fonctions class_get
et class_set
de l'Object Layer.
make
new
SYNOPSIS
make(self)
new(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
- 'new': (self, ...args) => OL.object_send_message(OL.class_send_message(self, 'make'), 'init', args),
- 'make': (self) => OL.class_make(self),
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.
free
SYNOPSIS
free(self)
DESCRIPTION
free
libère l'espace occupé par self
.
La méthode free
définie par la classe Root ne fait rien.
NOTE : free pourrait être automatiquement envoyé par l'Object Layer à une classe qui n'est plus référencée.
CODE
- 'free': (self) => undefined,
free
ne fait rien et retourne undefined
.
initialize
SYNOPSIS
initialize(self)
DESCRIPTION
initialize est automatiquement envoyé à une nouvelle classe par defclass
.
La méthode initialize
définie par la classe Root ne fait rien.
initialize est généralement redéfini par une classe qui doit initialiser ses propriétés de classe.
CODE
- 'initialize': (self) => self,
initialize
ne fait rien et retourne self
.
class
name
revision
superclass
SYNOPSIS
class(self)
name(self)
revision(self)
superclass(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 Root
, la classe Root.
CODE
- 'class': (self) => self,
- 'name': (self) => OL.class_name(self),
- 'revision': (self) => OL.class_revision(self),
- 'superclass': (self) => OL.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.
classMessages
instanceMessages
SYNOPSIS
classMessages(self, inherit = true)
instanceMessages(self, inherit = true)
DESCRIPTION
classMessages
retourne les messages de classe de self
dans un tableau.
Si inherit
vaut true
, 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.
Si inherit
vaut true
, instanceMessages
retourne aussi les messages d'instance hérités de toutes les superclasses de self
.
CODE
- 'classMessages':
- (self, inherit = true) => {
- let messages = OL.class_class_messages(self);
- if (messages)
- messages = Object.keys(messages);
- if (inherit) {
- let sc = OL.class_superclass(self);
- if (sc) {
- let inherited = OL.class_send_message(sc, 'classMessages');
- if (inherited)
- messages = messages ? [... new Set([...messages, ...inherited])] : inherited;
- }
- }
- return messages && messages.length > 0 ? messages : null;
- },
- 'instanceMessages':
- (self, inherit = true) => {
- let messages = OL.class_instance_messages(self);
- if (messages)
- messages = Object.keys(messages);
- if (inherit) {
- let sc = OL.class_superclass(self);
- if (sc) {
- let inherited = OL.class_send_message(sc, 'instanceMessages');
- if (inherited)
- messages = messages ? [... new Set([...messages, ...inherited])] : inherited;
- }
- }
- return messages && messages.length > 0 ? messages : null;
- },
classMessages
met messages
à la liste des messages de classe de self
, ajoute les messages de classe des superclasses de self
, en supprimant les doublons, si inherit
vaut true
puis retourne messages
.
instanceMessages
met messages
à la liste des messages d'instance de self
, ajoute les messages d'instance des superclasses de self
, en supprimant les doublons, si inherit
vaut true
puis retourne messages
.
classProperties
instanceProperties
SYNOPSIS
classProperties(self, inherit = true)
instanceProperties(self, inherit = true)
DESCRIPTION
classProperties
retourne les propriétés de classe de self
dans un tableau.
Si inherit
vaut true
, 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.
Si inherit
vaut true
, instanceProperties
retourne aussi les propriétés d'instance héritées de toutes les superclasses de self
.
CODE
- 'classProperties':
- (self, inherit = true) => {
- let properties = OL.class_class_properties(self);
- if (properties)
- properties = [... properties];
- if (inherit) {
- let sc = OL.class_superclass(self);
- if (sc) {
- let inherited_properties = OL.class_send_message(sc, 'classProperties');
- if (inherited_properties)
- properties = properties ? [... new Set([...properties, ...inherited_properties])] : inherited_properties;
- }
- }
- return properties && properties.length > 0 ? properties : null;
- },
- 'instanceProperties':
- (self, inherit = true) => {
- let properties = OL.class_instance_properties(self);
- if (properties)
- properties = [... properties];
- if (inherit) {
- let sc = OL.class_superclass(self);
- if (sc) {
- let inherited_properties = OL.class_send_message(sc, 'instanceProperties');
- if (inherited_properties)
- properties = properties ? [... new Set([...properties, ...inherited_properties])] : inherited_properties;
- }
- }
- return properties && properties.length > 0 ? properties : null;
- },
classProperties
met properties
à la liste des propriétés de classe de self
, ajoute les propriétés de classe des superclasses de self
, en supprimant les doublons, si inherit
vaut true
puis retourne properties
.
instanceProperties
met properties
à la liste des propriétés d'instance de self
, ajoute les propriétés d'instance des superclasses de self
, en supprimant les doublons, si inherit
vaut true
puis retourne properties
.
classMethodFor
instanceMethodFor
SYNOPSIS
classMethodFor(self, msg)
instanceMethodFor(self, msg)
DESCRIPTION
classMethodFor
retourne la fonction qui implémente le message de classe msg
de self
.
instanceMethodFor
retourne la fonction qui implémente le message d'instance msg
de self
.
CODE
- 'classMethodFor': (self, msg) => OL.class_find_class_method(self, msg),
- 'instanceMethodFor': (self, msg) => OL.class_find_instance_method(self, msg),
classMethodFor
et instanceMethodFor
retournent le résultat des fonctions class_find_class_method
et class_find_instance_method
class_add_instance_message
et class_remove_instance_message
de l'Object Layer.
addClassMessage
removeClassMessage
addInstanceMessage
removeInstanceMessage
SYNOPSIS
addClassMessage(self, msg)
removeClassMessage(self, msg)
addInstanceMessage(self, msg)
removeInstanceMessage(self, msg)
DESCRIPTION
addClassMessage
ajoute le message de classe msg
à self
.
removeClassMessage
retire le message de classe msg
à self
.
addInstanceMessage
ajoute le message d'instance msg
à self
.
removeInstanceMessage
retire le message d'instance msg
à self
.
CODE
- 'addClassMessage': (self, msg, f) => OL.class_add_class_message(self, msg, f),
- 'removeClassMessage': (self, msg) => OL.class_remove_class_message(self, msg),
- 'addInstanceMessage': (self, msg, f) => OL.class_add_instance_message(self, msg, f),
- 'removeInstanceMessage': (self, msg) => OL.class_remove_instance_message(self, msg),
addClassMessage
, removeClassMessage
, addInstanceMessage
et removeInstanceMessage
retournent le résultat des fonctions class_add_class_message
, class_remove_class_message
, class_add_instance_message
et class_remove_instance_message
de l'Object Layer.
addClassProperty
removeClassProperty
addInstanceProperty
removeInstanceProperty
SYNOPSIS
addClassProperty(self, prop)
removeClassProperty(self, prop)
addInstanceProperty(self, prop)
removeInstanceProperty(self, prop)
DESCRIPTION
addClassProperty
ajoute la propriété de classe prop
à self
.
removeClassProperty
retire la propriété de classe prop
à self
.
addInstanceProperty
ajoute la propriété d'instance prop
à self
.
removeInstanceProperty
retire la propriété d'instance prop
à self
.
CODE
- 'addClassProperty': (self, prop) => OL.class_add_class_property(self, prop),
- 'removeClassProperty': (self, prop) => OL.class_remove_class_property(self, prop),
- 'addInstanceProperty': (self, prop) => OL.class_add_instance_property(self, prop),
- 'removeInstanceProperty': (self, prop) => OL.class_remove_instance_property(self, prop),
addClassProperty
, removeClassProperty
, addInstanceProperty
et removeInstanceProperty
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.
perform
SYNOPSIS
perform(self, msg, args = false)
DESCRIPTION
perform
retourne le résultat de l'envoi du message msg
à self
avec args
en argument.
args
est un tableau.
Par défaut, le message n'a pas d'argument.
CODE
- 'perform': (self, msg, args = false) => OL.class_send_message(self, msg, args),
perform
retourne le résultat de l'envoi de msg
et de args
à self
.
read
write
SYNOPSIS
read(self, data)
write(self)
DESCRIPTION
write
retourne la sérialisation des propriétés de self
.
read
initialise les propriétés de self
avec data
.
data
est un objet sérialisé.
CODE
- 'read': (self, sdata) => {
- let properties = OL.class_send_message(self, 'classProperties');
- if (!properties)
- return self;
- let data = JSON.parse(sdata);
- if (typeof data !== 'object')
- throw new TypeError();
- let attributes = {};
- for (let p of properties) {
- if (data.hasOwnProperty(p))
- attributes[p] = data[p];
- }
- return OL.class_set_attributes(self, attributes);
- },
- 'write': (self) => JSON.stringify(OL.class_attributes(self)),
write
appelle la fonction JSON.stringify
avec en argument la liste des attributs de self
et retourne le résultat.
read
obtient la liste des propriétés de self
, appelle la fonction JSON.parse
avec data
en argument, vérifie que le résultat est un objet, puis initialise chaque attribut de self
avec la valeur correspondante extraite de cet objet.
error
doesNotContain
doesNotRecognize
notImplemented
subclassResponsibility
SYNOPSIS
error(self, err[, arg ...])
doesNotContain(self, prop)
doesNotRecognize(self, msg)
notImplemented(self, msg)
subclassResponsibility(self, msg)
DESCRIPTION
error
affiche sur la console un message d'erreur dont le texte est formaté en remplaçant chaque champ {n}
contenu dans la chaîne de caractères err
par le paramètre correspondant suivant err
en les numérotant à partir de 0.
doesNotContain
envoie le message error à self
avec en argument la constante Root.InvalidClassProperty
, le nom de la classe self
et prop
.
doesNotRecognize
envoie le message error à self
avec en argument Root.InvalidClassMessage
, le nom de la classe self
et msg
.
notImplemented
envoie le message error à self
avec en argument la constante Root.NotImplemented
, le nom de la classe self
et msg
.
Root.subclassResponsibility
envoie le message error à self
avec en argument la constante SubclassResponsibility
, le nom de la classe self
et 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.
CODE
- 'error': (self, err, ...args) => {
- let errmsg = err;
- for (let i = 0; i < args.length; i++)
- errmsg = errmsg.replace(new RegExp(`\\{${i}\\}`, 'gi'), args[i]);
- console.error(errmsg);
- return self;
- },
- 'doesNotContain': (self, prop) => OL.class_send_message(self, 'error', [Root.InvalidClassProperty, OL.class_name(self), prop]),
- 'doesNotRecognize': (self, msg) => OL.class_send_message(self, 'error', [Root.InvalidClassMessage, OL.class_name(self), msg]),
- 'notImplemented': (self, msg) => OL.class_send_message(self, 'error', [Root.NotImplemented, OL.class_name(self), msg]),
- 'subclassResponsibility': (self, msg) => OL.class_send_message(self, 'error', [Root.SubclassResponsibility, OL.class_name(self), msg]),
- },
error
formate le message d'erreur errmsg
en remplaçant successivement dans err
les expressions au format {n}
par les arguments suivants err
et l'affiche sur le flot de sortie en erreur de la console.
doesNotContain
, doesNotRecognize
, notImplemented
et subclassResponsibility
envoient le message error à self
avec en argument la constante du message d'erreur correspondant et ses paramètres.
MÉTHODES D'INSTANCE
get
set
SYNOPSIS
get(self, attr)
set(self, attr, val)
DESCRIPTION
get
retourne la valeur de la propriété attr
de self
.
set
met la valeur de la propriété attr
de self
à val
.
IMPORTANT : Copiez le contenu d'un attribut qui est un tableau ou un objet si vous voulez le modifier sans changer la valeur de l'attribut.
CODE
- { 'get': (self, attr) => OL.object_get(self, attr),
- 'set': (self, attr, val) => OL.object_set(self, attr, val),
get
et set
retournent le résultat des fonctions object_get
et object_set
de l'Object Layer.
init
SYNOPSIS
init(self[, arg ...])
DESCRIPTION
init est automatiquement envoyé à une nouvelle instance par new.
La méthode init
définie par la classe Root ne fait rien.
init est généralement redéfini par une classe qui doit initialiser ses propriétés d'instance.
CODE
- 'init': (self) => self,
init
ne fait rien et retourne self
.
free
SYNOPSIS
free(self)
DESCRIPTION
free
libère l'espace occupé par self
.
La méthode free
définie par la classe Root ne fait rien.
NOTE : free pourrait être automatiquement envoyé par l'Object Layer à une instance qui n'est plus référencée.
CODE
- 'free': (self) => undefined,
free
ne fait rien et retourne undefined
.
class
superclass
messages
properties
SYNOPSIS
class(self)
superclass(self)
messages(self, inherit = true)
properties(self, inherit = true)
DESCRIPTION
class
retourne la classe de self
.
superclass
retourne la superclasse de la classe de self
, i.e. null
si self
est une instance de la classe Root.
messages
retourne les messages reconnus par self
dans un tableau.
Si inherit
vaut true
, messages
retourne aussi les messages hérités de toutes les superclasses de $self
.
inherit
vaut true
par défaut.
properties
retourne les propriétés de self
dans un tableau.
Si inherit
vaut true
, properties
retourne aussi les propriétés héritées de toutes les superclasses de self
.
inherit
vaut true
par défaut.
CODE
- 'class': (self) => OL.object_class(self),
- 'superclass': (self) => OL.class_superclass(OL.object_class(self)),
- 'messages': (self, inherit = true) => OL.class_send_message(OL.object_class(self), 'instanceMessages', [inherit]),
- 'properties': (self, inherit = true) => OL.class_send_message(OL.object_class(self), 'instanceProperties', [inherit]),
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
.
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.
isKindOf
methodFor
respondsTo
assume
SYNOPSIS
isKindOf(self, c)
methodFor(self, msg)
respondsTo(self, msg)
assume(self, c)
DESCRIPTION
isKindOf
retourne true
si self
est une instance de la classe ou d'une sous-classe de c
ou false
dans le cas contraire.
methodFor
retourne la fonction qui implémente le message msg
pour self
ou false
si self
ne répond pas à msg
.
respondsTo
retourne true
si self
a une méthode pour le message msg
, false
dans le cas contraire.
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 class
sont conservées mais elles ne sont pas accessibles.
CODE
- 'respondsTo': (self, msg) => OL.class_find_instance_method_class(OL.object_class(self), msg) ? true : false,
- 'methodFor': (self, msg) => OL.class_find_instance_method(OL.object_class(self), msg),
- 'isKindOf': (self, c) => OL.class_is_kind_of(OL.object_class(self), c),
- 'assume': (self, c) => OL.object_assume(self, c),
isKindOf
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
retourne le résultat de la fonction class_find_instance_method
avec en argument la classe de self
et msg
.
respondsTo
retourne true
si le résultat de la fonction class_find_instance_method
avec en argument la classe de self
et msg
n'est pas false
, true
dans le cas contraire.
assume
appelle la fonction object_assume
avec c
en argument.
copy
SYNOPSIS
copy(self)
DESCRIPTION
copy
retourne une copie de self
.
IMPORTANT : object_copy
ne duplique pas les valeurs des attributs de self
. Si une classe a des propriétés qui sont des tableaux ou des objets, une redéfinition de la méthode est nécessaire.
CODE
- 'copy': (self) => OL.object_copy(self),
copy
retourne le résultat de la fonction object_copy
de l'Object Layer.
toString
SYNOPSIS
toString(self)
DESCRIPTION
toString
retourne une représentation lisible de self
.
La méthode toString
de la classe Root retourne une chaîne de caractères vide.
CODE
- 'toString': (self) => '',
toString
retourne une chaîne de caractères vide.
delegate
setDelegate
SYNOPSIS
delegate(self, msg = false[, arg ...])
setDelegate(self, $delegate)
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 false
.
Si msg
vaut false
, delegate
retourne le délégué de self
.
setDelegate
initialise la propriété delegate de self
avec $delegate
.
NOTE : Envoyer delegate ou setDelegate à une instance qui n'a pas la propriété delegate envoie le message doesNotContain à l'instance.
CODE
- 'delegate': (self, msg = false, ...args) => {
- let delegate = OL.object_get(self, 'delegate');
- if (!msg)
- return delegate;
- if (!delegate)
- return false;
- if (!OL.object_send_message(delegate, 'respondsTo', [msg]))
- return false;
- return OL.object_send_message(delegate, msg, args);
- },
- 'setDelegate': (self, delegate) => {
- if (! (delegate === null || (typeof delegate === 'object' && delegate instanceof OL.Instance)))
- throw new TypeError();
- return OL.object_set(self, 'delegate', delegate);
- },
delegate
met delegate
à la valeur de la propriété delegate de self
, retourne delegate
si msg
vaut false
, retourne false
si delegate
vaut null
ou si delegate
ne répond pas à msg
, retourne le résultat de l'envoi de msg
avec les arguments de delegate
suivants msg
à delegate
.
setDelegate
vérifie que delegate
est null
ou un objet puis met la propriété delegate de self
à delegate
.
perform
SYNOPSIS
perform(self, msg, args = false)
DESCRIPTION
perform
retourne le résultat de l'envoi du message msg
à self
avec args
en argument.
args
est un tableau.
Par défaut, le message n'a pas d'argument.
CODE
- 'perform': (self, msg, args = false) => OL.object_send_message(self, msg, args),
perform
retourne le résultat de l'envoi de msg
et de args
à self
.
read
write
SYNOPSIS
read(self, data)
write(self)
DESCRIPTION
write
retourne la sérialisation des propriétés de self
.
read
initialise les propriétés de self
avec data
.
data
est un objet sérialisé.
CODE
- 'read': (self, sdata) => {
- let properties = OL.class_send_message(OL.object_class(self), 'instanceProperties');
- if (!properties)
- return self;
- let data = JSON.parse(sdata);
- if (typeof data !== 'object')
- throw new TypeError();
- let attributes = {};
- for (let p of properties) {
- if (data.hasOwnProperty(p))
- attributes[p] = data[p];
- }
- return OL.object_set_attributes(self, attributes);
- },
- 'write': (self) => JSON.stringify(OL.object_attributes(self)),
write
appelle la fonction JSON.stringify
avec en argument la liste des attributs de self
et retourne le résultat.
read
obtient la liste des propriétés de self
, appelle la fonction JSON.parse
avec data
en argument, vérifie que le résultat est un objet, puis initialise chaque attribut de self
avec la valeur correspondante extraite de cet objet.
error
doesNotContain
doesNotRecognize
notImplemented
subclassResponsibility
SYNOPSIS
error(self, err[, arg ...])
doesNotContain(self, prop)
doesNotRecognize(self, msg)
notImplemented(self, msg)
subclassResponsibility(self, msg)
DESCRIPTION
error
affiche sur la console un message d'erreur dont le texte est formaté en remplaçant chaque champ {n}
contenu dans la chaîne de caractères err
par le paramètre correspondant suivant err
en les numérotant à partir de 0.
doesNotContain
envoie le message error à self
avec en argument la constante Root.InvalidClassProperty
, le nom de la classe de self
et prop
.
doesNotRecognize
envoie le message error à self
avec en argument Root.InvalidClassMessage
, le nom de la classe de self
et msg
.
notImplemented
envoie le message error à self
avec en argument la constante Root.NotImplemented
, le nom de la classe de self
et msg
.
Root.subclassResponsibility
envoie le message error à self
avec en argument la constante SubclassResponsibility
, le nom de la classe self
et 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.
CODE
- 'error': (self, err, ...args) => {
- let errmsg = err;
- for (let i = 0; i < args.length; i++)
- errmsg = errmsg.replace(new RegExp(`\\{${i}\\}`, 'gi'), args[i]);
- console.error(errmsg);
- return self;
- },
- 'doesNotContain': (self, prop) => OL.object_send_message(self, 'error', [Root.InvalidInstanceProperty, OL.class_name(OL.object_class(self)), prop]),
- 'doesNotRecognize': (self, msg) => OL.object_send_message(self, 'error', [Root.InvalidInstanceMessage, OL.class_name(OL.object_class(self)), msg]),
- 'notImplemented': (self, msg) => OL.object_send_message(self, 'error', [Root.NotImplemented, OL.class_name(OL.object_class(self)), msg]),
- 'subclassResponsibility': (self, msg) => OL.object_send_message(self, 'error', [Root.SubclassResponsibility, OL.class_name(OL.object_class(self)), msg]),
- }
- );
error
formate le message d'erreur errmsg
en remplaçant successivement dans err
les expressions au format {n}
par les arguments suivants err
et l'affiche sur le flot de sortie en erreur de la console.
doesNotContain
, doesNotRecognize
, notImplemented
et subclassResponsibility
envoient le message error à self
avec en argument la constante du message d'erreur correspondant et ses paramètres.
- Root.InvalidClassProperty = '{0}::{1} Invalid class property';
- Root.InvalidClassMessage = '{0}::{1} Invalid class message';
- Root.InvalidInstanceProperty = '{0}::{1} Invalid instance property';
- Root.InvalidInstanceMessage = '{0}::{1} Invalid instance message';
- Root.NotImplemented = '{0}::{1} Not implemented';
- Root.SubclassResponsibility = '{0}::{1} Subclass responsibility';
Définit les messages d'erreurs affichés par les méthodes de classe et les méthodes d'instance doesNotContain, doesNotRecognize, notImplemented et subclassResponsibility.
Commentaires