Quelqu'un peut-il fournir une explication simple de méthodes vs. fonctions dans le contexte OOP?
Un function est un morceau de code appelé par son nom. Il est possible de transmettre des données à utiliser (c’est-à-dire les paramètres) et éventuellement de renvoyer des données (la valeur de retour). Toutes les données transmises à une fonction sont explicitement transmises.
Une méthode est un morceau de code appelé par un nom associé à un objet. Dans la plupart des cas, il est identique à une fonction, à deux différences près:
(Ceci est une explication simplifiée, ignorant les problèmes de portée etc.)
Une méthode est sur un objet.
Une fonction est indépendante d'un objet.
Pour Java, il n'y a que des méthodes.
Pour C, il n'y a que des fonctions.
Pour C++, cela dépend si vous êtes ou non dans une classe.
'méthode' est le mot orienté objet pour 'fonction'. C'est à peu près tout ce qu'il y a à faire (c.-à-d. Aucune différence réelle).
Malheureusement, je pense que beaucoup de réponses ici perpétuent ou avancent l'idée qu'il existe une différence complexe et significative.
Vraiment - il n'y a pas tant que ça à faire, juste des mots différents pour la même chose.
[ajout tardif]
En fait, comme l'a souligné Brian Neal dans un commentaire à cette question , le standard C++ n'utilise jamais le terme 'méthode' lorsqu'il fait référence à des fonctions membres. Certaines personnes peuvent considérer cela comme une indication que C++ n'est pas vraiment un langage orienté objet. Cependant, je préfère considérer cela comme un indice qu'un groupe assez intelligent de personnes ne pensait pas qu'il y avait une raison particulièrement forte d'utiliser un terme différent.
En général: les méthodes sont des fonctions qui appartiennent à une classe, les fonctions peuvent être sur n'importe quelle autre portée du code afin que vous puissiez indiquer que toutes les méthodes sont des fonctions, mais que toutes les fonctions ne sont pas des méthodes:
Prenons l'exemple suivant en python:
class Door:
def open(self):
print 'hello stranger'
def knock_door:
a_door = Door()
Door.open(a_door)
knock_door()
L'exemple donné vous montre une classe appelée "Door" qui a une méthode ou une action appelée "open", on l'appelle une méthode car elle a été déclarée à l'intérieur d'une classe. Il y a une autre partie du code avec "def" juste en dessous de laquelle définit une fonction, c'est une fonction car elle n'est pas déclarée dans une classe, cette fonction appelle la méthode que nous avons définie dans notre classe comme vous pouvez le voir et enfin la fonction est en cours appelé par lui-même.
Comme vous pouvez le voir, vous pouvez appeler une fonction n'importe où, mais si vous souhaitez appeler une méthode, vous devez soit transmettre un nouvel objet du même type que la classe, la méthode est déclarée (Class.method (objet)) ou vous devez invoquer. la méthode à l'intérieur de l'objet (object.Method ()), au moins en python.
Pensez aux méthodes comme ne pouvant être accomplies que par une seule entité. Par conséquent, si vous avez une classe Dog, il serait logique d’avoir une fonction aboiement uniquement dans cette classe. Ce serait une méthode. Si vous avez également une classe Person, écrivez une fonction "feed" car celle-ci n'appartient à aucune classe, tant les humains que les chiens peuvent être nourris et vous pourriez appeler cela une fonction, car elle n'appartient à aucune classe en particulier.
Une définition très générale de la différence principale entre une Fonction et une Méthode :
Les fonctions sont définies en dehors des classes, tandis que les méthodes sont définies à l'intérieur des classes et en font partie.
Un moyen simple à retenir:
Si vous avez envie de lire, voici "Mon introduction aux méthodes OO"
L'idée derrière le paradigme orienté objet est de "menacer" le logiciel est composé de .. bien "objets". Les objets du monde réel ont des propriétés, par exemple si vous avez un employé, cet employé a un nom, un identifiant d'employé, un poste, il appartient à un service, etc.
L'objet sait également comment gérer ses attributs et effectuer certaines opérations dessus. Disons que si nous voulons savoir ce qu'un employé fait actuellement, nous le lui demanderions.
employe whatAreYouDoing.
Ce "whatAreYouDoing" est un "message" envoyé à l'objet. L'objet sait comment répondre à cette question, il est dit qu'il a une "méthode" pour résoudre la question.
Ainsi, la façon dont les objets doivent exposer son comportement s'appellent des méthodes. Les méthodes sont donc que l'objet d'artefact doit "faire" quelque chose.
D'autres méthodes possibles sont
employee whatIsYourName
employee whatIsYourDepartmentsName
etc.
Les fonctions de l’autre côté sont des moyens utilisés par un langage de programmation pour calculer certaines données, par exemple, vous pouvez avoir la fonction addValues (8, 8) qui renvoie 16
// pseudo-code
function addValues( int x, int y ) return x + y
// call it
result = addValues( 8,8 )
print result // output is 16...
Comme les premiers langages de programmation populaires (tels que fortran, c, Pascal) ne couvraient pas le paradigme OO, ils n’appelaient que ces artefacts "fonctions".
par exemple, la fonction précédente en C serait:
int addValues( int x, int y )
{
return x + y;
}
Il n'est pas "naturel" de dire qu'un objet a une "fonction" pour effectuer une action, car les fonctions sont davantage liées aux opérations mathématiques qu'un employé a peu de mathématique, mais vous pouvez avoir des méthodes qui font exactement la même chose, Par exemple, en Java, ce serait la fonction addValues équivalente.
public static int addValues( int x, int y ) {
return x + y;
}
Vous semble familier? C’est parce que Java a ses racines sur C++ et C++ sur C.
À la fin, il ne s’agit que d’un concept. Dans l’application, leur apparence peut être identique, mais dans la documentation OO, elles sont appelées méthode.
Voici un exemple d'objet précédemment employé en Java.
public class Employee {
Department department;
String name;
public String whatsYourName(){
return this.name;
}
public String whatsYourDeparmentsName(){
return this.department.name();
}
public String whatAreYouDoing(){
return "nothing";
}
// Ignore the following, only set here for completness
public Employee( String name ) {
this.name = name;
}
}
// Usage sample.
Employee employee = new Employee( "John" ); // Creates an employee called John
// If I want to display what is this employee doing I could use its methods.
// to know it.
String name = employee.whatIsYourName():
String doingWhat = employee.whatAreYouDoint();
// Print the info to the console.
System.out.printf("Employee %s is doing: %s", name, doingWhat );
Output:
Employee John is doing nothing.
La différence est donc sur le "domaine" où il est appliqué.
AppleScript a l'idée de matphore "en langage naturel", ce que OO avait à un moment donné. Par exemple Smalltalk. J'espère qu'il sera peut-être plus facile pour vous de comprendre les méthodes dans les objets après avoir lu ceci.
Remarque: le code ne doit pas être compilé, juste pour servir d'exemple. N'hésitez pas à modifier le post et à ajouter un exemple Python.
Dans le monde OO, les deux sont généralement utilisés pour signifier la même chose.
Dans une perspective mathématique et CS pure, une fonction retournera toujours le même résultat si elle est appelée avec les mêmes arguments (f (x, y) = (x + y)). En revanche, une méthode est généralement associée à une instance d’une classe. Encore une fois cependant, la plupart des langues OO modernes n'utilisent plus le terme "fonction" pour la plupart. De nombreuses méthodes statiques peuvent ressembler beaucoup à des fonctions, car elles n'ont généralement pas d'état (pas toujours true).
Supposons qu'une fonction est un bloc de code (généralement avec sa propre portée, et parfois avec sa propre fermeture) pouvant recevoir des arguments et renvoyer un résultat.
Une méthode est une fonction qui appartient à un objet (dans certains systèmes orientés objet, il est plus correct de dire qu'elle appartient à une classe). Être "possédé" par un objet/une classe signifie que vous vous référez à la méthode à travers l'objet/la classe; Par exemple, en Java, si vous souhaitez appeler une méthode "open ()" appartenant à un objet "door", vous devez écrire "door.open ()".
Habituellement, les méthodes acquièrent également des attributs supplémentaires décrivant leur comportement dans l'objet/la classe, par exemple: visibilité (liée au concept d'encapsulation orienté objet) qui définit à partir de quels objets (ou classes) la méthode peut être appelée.
Dans de nombreux langages orientés objet, toutes les "fonctions" appartiennent à un objet (ou une classe) et, par conséquent, dans ces langages, il n'y a pas de fonctions qui ne sont pas des méthodes.
Une fonction ou une méthode est un morceau de code appelé pouvant être appelé, qui effectue certaines opérations et renvoie éventuellement une valeur.
Dans le langage C, le terme fonction est utilisé. Java & C # les gens diraient que c'est une méthode (et une fonction dans ce cas est définie dans une classe/un objet).
Un programmeur C++ peut l’appeler une fonction ou parfois une méthode (selon qu’ils écrivent du code procédural de style c ++ ou une méthode orientée objet de C++, un programmeur uniquement C/C++ l’appellera probablement 'méthode' est moins utilisé dans la littérature C/C++).
Vous utilisez une fonction en appelant simplement son nom comme,
result = mySum(num1, num2);
Vous appelez une méthode en référençant d’abord son objet comme ceci:
result = MyCalc.mySum(num1,num2);
Une fonction est un concept mathématique. Par exemple:
f(x,y) = sin(x) + cos(y)
dit que la fonction f() renverra le péché du premier paramètre ajouté au cosinus du deuxième paramètre. C'est juste des maths. En l'occurrence, sin () et cos () sont également des fonctions. Une fonction a une autre propriété: tous les appels à une fonction avec les mêmes paramètres devraient renvoyer le même résultat.
Une méthode, en revanche, est une fonction liée à un objet dans un langage orienté objet. Il a un paramètre implicite: l'objet sur lequel on agit (et son état).
Donc, si vous avez un objet Z avec une méthode g (x), vous pourriez voir ceci:
Z.g(x) = sin(x) + cos(Z.y)
Dans ce cas, le paramètre x est transmis, comme dans l'exemple de fonction précédent. Cependant, le paramètre de cos () est une valeur qui réside à l'intérieur de l'objet Z. Z et les données qui s'y trouvent (Z.y) sont des paramètres implicites de la méthode g() de Z.
Historiquement, il peut y avoir eu une différence subtile avec une "méthode" étant quelque chose qui ne renvoie pas de valeur et une "fonction" qui le fait. Chaque langage a son propre lexique de termes avec une signification particulière.
Dans "C" , le mot "fonction" signifie une routine de programme .
Dans Java , le terme "fonction" n’a aucune signification particulière. Considérant que "méthode" signifie l'une des routines qui constituent l'implémentation d'une classe.
En C # qui se traduirait par:
public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function
Mais vraiment, je répète qu’il n’ya vraiment aucune différence entre les 2 concepts . Si vous utilisez le terme "fonction" dans des discussions informelles sur Java, les gens vont supposer que vous voulez dire "méthode" et continuer. Ne l'utilisez pas dans les documents ou les présentations appropriés sur Java, sinon vous aurez l'air ridicule.
Les méthodes sont des fonctions de classes. Dans le jargon normal, les gens échangent méthode et fonction partout. En gros, vous pouvez les considérer comme la même chose (vous ne savez pas si les fonctions globales sont appelées méthodes).
Les méthodes d'une classe agissent sur l'instance de la classe, appelée l'objet.
class Example
{
public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable".
public void UpdateData() // .. and manipulates it (This is a method by the way)
{
data = data + 1;
}
public void PrintData() // This is also a method
{
Console.WriteLine(data);
}
}
class Program
{
public static void Main()
{
Example exampleObject1 = new Example();
Example exampleObject2 = new Example();
exampleObject1.UpdateData();
exampleObject1.UpdateData();
exampleObject2.UpdateData();
exampleObject1.PrintData(); // Prints "2"
exampleObject2.PrintData(); // Prints "1"
}
}
Dans les langages OO tels que Object Pascal ou C++, une "méthode" est une fonction associée à un objet. Ainsi, par exemple, un objet "Chien" pourrait avoir une fonction "aboiement" et cela serait considéré comme une "méthode". En revanche, la fonction "StrLen" est autonome (elle fournit la longueur d'une chaîne fournie en argument). C'est donc juste une "fonction". Le langage Javascript est également techniquement orienté objet, mais rencontre de nombreuses limitations par rapport à un langage complet comme le C++, le C # ou le Pascal. Néanmoins, la distinction devrait encore rester.
Quelques faits supplémentaires: C # est entièrement orienté objet, vous ne pouvez donc pas créer de "fonctions" autonomes. En C #, chaque fonction est liée à un objet et est donc techniquement une "méthode". Le kicker est que peu de gens en C # les appellent des "méthodes" - ils utilisent simplement le terme "fonctions" car il n’ya pas de réelle distinction à faire.
Enfin, pour que les gourous de Pascal ne me sautent pas dessus, Pascal fait également la différence entre les "fonctions" (qui renvoient une valeur) et les "procédures" qui ne le font pas. C # ne fait pas cette distinction de manière explicite bien que vous puissiez, bien sûr, choisir de renvoyer une valeur ou non.
Function est un ensemble de logique pouvant être utilisé pour manipuler des données.
While, Method est une fonction utilisée pour manipuler les données de l'objet auquel il appartient ..__ Donc techniquement, si vous avez une fonction qui n'est pas complètement liée à votre classe mais a été déclarée dans la classe, ce n'est pas une méthode; C'est ce qu'on appelle un mauvais design.
Comme vous avez mentionné Python, les éléments suivants pourraient illustrer utilement la relation entre méthodes et objets dans les langages orientés objet les plus modernes. En un mot, ce qu'ils appellent une "méthode" est simplement une fonction à laquelle est transmis un argument supplémentaire (comme l'ont souligné d'autres réponses), mais Python le rend plus explicite que la plupart des langages.
# perfectly normal function
def hello(greetee):
print "Hello", greetee
# generalise a bit (still a function though)
def greet(greeting, greetee):
print greeting, greetee
# hide the greeting behind a layer of abstraction (still a function!)
def greet_with_greeter(greeter, greetee):
print greeter.greeting, greetee
# very simple class we can pass to greet_with_greeter
class Greeter(object):
def __init__(self, greeting):
self.greeting = greeting
# while we're at it, here's a method that uses self.greeting...
def greet(self, greetee):
print self.greeting, greetee
# save an object of class Greeter for later
hello_greeter = Greeter("Hello")
# now all of the following print the same message
hello("World")
greet("Hello", "World")
greet_with_greeter(hello_greeter, "World")
hello_greeter.greet("World")
Maintenant, comparons la fonction greet_with_greeter
et la méthode greet
: la seule différence est le nom du premier paramètre (dans la fonction que je l'appelais "greeter", dans la méthode que je l'appelais "self"). Je peux donc utiliser la méthode greet
exactement de la même manière que la fonction greet_with_greeter
(en utilisant la syntaxe "dot" pour l'obtenir, puisque je l'ai définie dans une classe):
Greeter.greet(hello_greeter, "World")
J'ai donc efficacement transformé une méthode en une fonction. Puis-je transformer une fonction en une méthode? Eh bien, comme Python vous laisse bousiller avec les classes une fois qu’elles sont définies, essayons:
Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")
Oui, la fonction greet_with_greeter
est maintenant appelée méthode greet2
. Cela montre la seule différence réelle entre une méthode et une fonction: lorsque vous appelez une méthode "sur" un objet en appelant object.method(args)
, le langage le transforme comme par magie en method(object, args)
.
(Les puristes d'OO pourraient dire qu'une méthode est quelque chose de différent d'une fonction. Si vous entrez dans les langages avancés Python ou Ruby - ou Smalltalk! la principale différence conceptuelle reste le paramètre supplémentaire caché.)
pour moi: la fonction d'une méthode et d'une fonction est la même si je conviens que:
Tout comme n'importe quel morceau de code, vous pouvez avoir des objets que vous insérez et vous pouvez avoir un objet qui en résulte. Pendant ce temps, ils pourraient changer l'état d'un objet mais cela ne changerait pas leur fonctionnement de base pour moi.
Il peut y avoir une définition différente dans les fonctions d’appel d’objets ou d’autres codes. Mais n’est-ce pas là une différence verbale et c’est pourquoi les gens les échangent? Les exemples de calcul que je ferais attention avec. parce que j'engage des employés pour faire mes calculs:
new Employer().calculateSum( 8, 8 );
En procédant ainsi, je peux compter sur un employeur pour effectuer les calculs. S'il veut plus d'argent, je le libère et laisse la fonction d'élimination des employés inutilisés du récupérateur de carbure faire le reste et obtenir un nouvel employé.
Même en faisant valoir qu'une méthode est une fonction d'objets et qu'une fonction est un calcul non connecté, cela ne m'aidera pas. Le descripteur de fonction lui-même et, idéalement, la documentation de la fonction me diront ce dont il a besoin et ce qu’elle peut renvoyer. Le reste, comme manipuler l'état d'un objet n'est pas vraiment transparent pour moi. Je m'attends à ce que les fonctions et les méthodes fournissent et manipulent ce qu'elles prétendent sans avoir besoin de savoir en détail comment elles le font .. Même une fonction de calcul pure peut changer l'état de la console ou l'ajouter à un fichier journal.
Pour une approximation de premier ordre, une méthode (en style C++ OO) est un autre mot pour une fonction membre, c'est-à-dire une fonction faisant partie d'une classe.
Dans des langages tels que C/C++, vous pouvez avoir des fonctions qui ne sont pas membres d'une classe; vous n'appelez pas une fonction non associée à une classe une méthode.
De mon point de vue, une méthode est toute opération pouvant être effectuée sur une classe. C'est un terme général utilisé en programmation.
Dans de nombreuses langues, les méthodes sont représentées par des fonctions et des sous-routines. La principale distinction que la plupart des langues utilisent pour ces fonctions est que les fonctions peuvent renvoyer une valeur à l'appelant et qu'un sous-programme ne peut pas. Cependant, beaucoup de langues modernes ont seulement des fonctions, mais celles-ci peuvent ne renvoyer aucune valeur.
Par exemple, supposons que vous souhaitiez décrire un chat et que vous souhaitiez que celui-ci soit capable de bâiller. Vous créeriez une classe Cat, avec une méthode Yawn, qui serait probablement une fonction sans valeur de retour.
Ne compliquons pas trop ce qui devrait être une réponse très simple. Méthodes et fonctions sont la même chose. Vous appelez une fonction une fonction lorsqu'elle se trouve en dehors d'une classe et vous appelez une fonction une méthode lorsqu'elle est écrite à l'intérieur d'une classe.
Les personnes à mon humble avis voulaient juste inventer un nouveau mot pour faciliter la communication entre les programmeurs quand ils voulaient se référer à des fonctions à l'intérieur d'objets.
Si vous dites des méthodes, vous entendez des fonctions dans la classe ..__ Si vous dites des fonctions, vous entendez simplement des fonctions hors de la classe.
La vérité est que les deux mots sont utilisés pour décrire des fonctions. Même si vous l'avez utilisé à tort, rien ne se passe mal. Les deux mots décrivent bien ce que vous voulez réaliser dans votre code.
Function est un code qui doit jouer un rôle ( une fonction ) dans la réalisation de quelque chose ..____. La méthode est une méthode pour résoudre le problème.
Il fait la même chose. C'est la même chose. Si vous voulez être très précis et respecter la convention, vous pouvez appeler des méthodes en tant que fonctions à l'intérieur d'objets.
Function est le concept qui appartient principalement à Programmation orientée procédure où une fonction est une entité pouvant traiter des données et vous renvoyer une valeur.
Méthode est le concept de Programmation orientée objet où une méthode est membre d'une classe qui effectue principalement un traitement sur les membres de la classe.
Je sais que beaucoup d’autres ont déjà répondu, mais j’ai trouvé ce qui suit est une réponse simple, mais efficace, à une ligne. Bien que cela ne semble pas beaucoup mieux que les autres réponses ici, mais si vous le lisez attentivement, il a tout ce que vous devez savoir sur la méthode vs fonction.
Une méthode est une fonction qui a un récepteur défini, en termes de OOP, une méthode est une fonction sur une instance d'un objet.
Je ne suis pas un expert, mais voici ce que je sais:
La fonction est un terme de langage C, il fait référence à un morceau de code et le nom de la fonction sera l'identifiant pour utiliser cette fonction.
La méthode est le terme OO, elle comporte généralement un pointeur this dans le paramètre function. Vous ne pouvez pas appeler ce morceau de code comme C, vous devez utiliser objet pour l'invoquer.
Les méthodes d'invocation sont également différentes. Ici, invoquez le sens pour trouver l'adresse de ce morceau de code. C/C++, le temps de liaison utilisera le symbole de fonction pour localiser.
Objecive-C est différent. Invoke signifie une fonction C qui utilise la structure de données pour trouver l'adresse. Cela signifie que tout est connu au moment de l'exécution.
Voici quelques explications entre méthode et fonction à l'aide d'exemples JavaScript:
test(20, 50);
est une fonction définie et utilisée pour exécuter certaines étapes ou renvoyer quelque chose en retour pouvant être stocké/utilisé quelque part.
Vous pouvez réutiliser le code: définissez le code une fois et utilisez-le plusieurs fois.
Vous pouvez utiliser le même code plusieurs fois avec des arguments différents pour produire des résultats différents.
var x = myFunction(4, 3); // Function is called, return value will end up in x
function myFunction(a, b) {
return a * b; // Function returns the product of a and b
}
var test = something.test();
here test () peut être une méthode pour un objet ou un prototype défini par un prototype pour les objets intégrés, voici plus d'explications:
Les méthodes JavaScript sont les actions pouvant être effectuées sur des objets.
Une méthode JavaScript est une propriété contenant une définition de fonction.
Propriété/méthode intégrée pour les chaînes en javascript:
var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!
Exemple personnalisé:
function person(firstName, lastName, age, eyeColor) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.eyeColor = eyeColor;
this.changeName = function (name) {
this.lastName = name;
};
}
something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'
Vous pouvez définir des propriétés pour String, Array, etc., par exemple
String.prototype.distance = function (char) {
var index = this.indexOf(char);
if (index === -1) {
console.log(char + " does not appear in " + this);
} else {
console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
}
};
var something = "ThisIsSomeString"
// now use distance like this, run and check console log
something.distance("m");
Quelques références: Méthode objet Javascript , Fonctions , Plus d'infos sur le prototype
De la lecture ce document sur Microsoft
Les membres contenant du code exécutable sont collectivement appelés membres de fonction d'une classe. La section précédente décrit les méthodes, qui constituent le type principal de membres de fonction. Cette section décrit les autres types de membres de fonction pris en charge par C #: constructeurs, propriétés, indexeurs, événements, opérateurs et finaliseurs.
Les méthodes sont donc le sous-ensemble des fonctions. Chaque méthode est une fonction mais toutes les fonctions ne sont pas une méthode. Par exemple, une constructor
ne peut pas être dite en tant que méthode mais c'est une fonction.
Function - Fonction dans un morceau de code indépendant qui inclut une logique et doit être appelée indépendammentet sont définis en dehors de la classe.
Méthode - Une méthode est un élément de code indépendant qui s'appelle appelé en référence à un objet et qui doit être défini dans la classe.
Une classe est la collecte de certaines données et fonctions éventuellement avec un constructeur.
Lors de la création d'une instance (copie, réplication) de cette classe particulière, le constructeur initialise la classe et renvoie un objet.
Maintenant, la classe devient objet (sans constructeur) & Les fonctions sont appelées méthode dans le contexte de l'objet.
Donc en gros
Classe <== new ==> Object
Fonction <== new ==> Méthode
En Java, il est généralement indiqué que le nom du constructeur est identique au nom de la classe, mais en réalité, ce constructeur ressemble au bloc d'instance et au bloc statique, mais avec un type de retour défini par l'utilisateur (c'est-à-dire, type de classe).
Alors que la classe peut avoir un bloc statique, un bloc d'instance, un constructeur, une fonction .__, l'objet n'a généralement que des données et une méthode.
En C++, parfois, méthode est utilisée pour refléter la notion de fonction membre d'une classe. Cependant, récemment, j'ai trouvé une déclaration dans le livre «Langage de programmation C++, 4e édition», à la page 586 "Classes dérivées".
Une fonction virtuelle est parfois appelée une méthode.
Ceci est un peu déroutant, mais il a dit parfois , cela a donc du sens, le créateur de C++ a tendance à voir les méthodes car les fonctions peuvent être invoquées sur des objets et peuvent se comporter de manière polymorphe.