Les différentes langues de l'approche de développement de différentes façons. En particulier, C# et Java ont un fort point de vue par rapport à OO qui mène à tout est un objet état d'esprit (le C# est un peu plus laxiste ici). Dans cette approche, les méthodes d'extension fournissent un moyen simple pour l'extension d'un objet existant ou de l'interface pour ajouter de nouvelles fonctionnalités.
Il n'existe pas de méthodes d'extension en C++, ils ne sont pas nécessaires. Lors de l'élaboration de C++, oubliez le tout est un objet paradigme-qui, en passant, est faux, même en Java/C# [*]. Un autre état d'esprit est pris en C++, il y a des objets, et les objets ont des activités qui sont intrinsèquement partie de l'objet, mais il y a aussi d'autres activités qui font partie de l'interface et n'a pas besoin d'être partie de la classe. A lire absolument par Herb Sutter est Ce qui est Dans une Classe?, où l'auteur défend (et je suis d'accord) que vous pouvez facilement étendre une classe avec de simples fonctions libres.
Comme un exemple simple, le standard basé sur un modèle de classe basic_ostream
a quelques méthodes pour vider le contenu de certains types primitifs, et puis elle est renforcée avec (également basé sur un modèle) gratuit fonctions étendre cette fonctionnalité à d'autres types de publics actuels de l'interface. Par exemple, std::cout << 1;
est mis en œuvre en tant que membre de la fonction, tandis que d' std::cout << "Hi";
gratuit) est une fonction implémentée en d'autres termes, plus les membres de base.
Extensibilité en C++ est obtenu par le biais de fonctions libres, non pas par des moyens d'ajouter de nouvelles méthodes à des objets existants.
[*] Tout est pas un objet.
Dans un domaine donné contient un ensemble d'objets réels qui peuvent être modélisées et les opérations qui peuvent être appliquées, dans certains cas, ces opérations feront partie de l'objet, mais dans certains autres cas, ils ne le seront pas. En particulier, vous trouverez l'utilitaire de classes dans les langues qui prétendent que tout est un objet et ceux de l'utilitaire de classes ne sont rien, mais une couche en essayant de cacher le fait que ces méthodes n'appartiennent pas à un objet particulier.
Même certaines opérations qui sont mises en œuvre que les fonctions de membres ne sont pas vraiment des opérations sur les objets. Envisager l'ajout d'un Complex
nombre de classe, comment est - sum
(ou +
) plus d'une opération sur le premier argument de la seconde? Pourquoi a.sum(b);
ou b.sum(a)
, ne devrait-elle pas être sum( a, b )
?
Forcer les opérations à être membre de méthodes réellement produit des effets bizarres-mais nous sommes habitués à eux: a.equals(b);
et b.equals(a);
pourrait avoir des résultats complètement différents, même si la mise en œuvre de l' equals
est entièrement symétrique. (Pensez à ce qui se passe lorsque a
ou b
est un pointeur null)