Y a-t-il un moyen d'ajouter de nouvelles méthodes à une classe, sans modifier la définition de la classe d'origine (c'est-à-dire la classe compilée de classe et le fichier de classe correspondant) comme des méthodes d'extension de classe C #? p>
9 Réponses :
Non. C ++ n'a aucune capacité de ce type. p>
Comme mentionné dans d'autres réponses, les solutions de contournement commun sont: p>
Peut aussi être fait par Double Dispatch
Non, vous ne pouvez pas faire cela en C ++. p>
Si vous voulez réaliser quelque chose comme celui-ci, vous avez 2 options, p>
Je préfère l'approche de la délégation. P>
Bonne réponse - mais je ne suis pas sûr que quelqu'un posant des questions comme celles-ci sait de savoir quoi mettre en œuvre lorsqu'il entend des termes tels que "hériter" ou "délégué".
@mh, probablement pas. Mais maintenant, ils connaissent les termes corrects à mettre dans une recherche à une ou Google
désolé, non. Une fois que votre code est à Obj, vous ne pouvez pas le changer. Si cela peut être fait dans les classes partielles VC serait déjà pris en charge. Il existe une exception par exception, les méthodes de l'opérateur peuvent être étendues à l'aide de fonctions globales, jolie comme la manière dont Cout << est implémentée dans STL. P>
C # Classe Les méthodes d'extension sont principalement du sucre syntaxique. Vous obtenez la même fonctionnalité avec des fonctions libres (c'est-à-dire des fonctions avec une référence ou une référence constante à votre classe comme premier paramètre). Puisque cela fonctionne bien pour la STL, pourquoi pas pour votre classe? p>
Bien sûr, vous pouvez:
template <typename Ext> class Class: public Ext { /* ... */ };
Généralement pas. Toutefois, si la bibliothèque ne crée pas d'autres instances de la classe nécessitant votre extension et que vous êtes en mesure de modifier tous les endroits de l'application qui créent une instance de la classe et nécessitent vos extensions, il existe une façon de choisir:
Exemple: p> C'est à peu près comment mettre en œuvre la méthode "hériter" suggérée par GLEN. La méthode "Wrapper Class avec la même interface" de Glen est également très belle d'un point de vue théorique, mais a des propriétés légèrement différentes qui le rend moins probable de travailler dans votre cas. P> P>
Il y a une solution dans laquelle cela peut être fait. Et c'est en relaxant vos besoins un peu. En C ++, les gens disent souvent que l'interface d'une classe consiste à non seulement de ses fonctions membres, mais de toutes les fonctions qui fonctionnent sur la classe EM>. P>
C'est-à-dire que des fonctions non membres pouvant être attribuées à la classe sous forme de paramètre doivent être considérées comme faisant partie de son interface. P>
Par exemple, Et si vous acceptez cette définition, vous pouvez toujours prolonger une classe simplement en ajoutant des fonctions non membres. P> std :: Recherche (Rechercher () Code> ou
std :: Trier () Code> Fait partie de l'interface de
std :: vecteur code> , même s'ils ne sont pas membres de la classe. P>
Vous ne pouvez pas ajouter de méthodes ou de données physiquement au fichier de classe qui est sous forme binaire. Cependant, vous pouvez ajouter des méthodes et des données (fonctionnalité et état) aux objets de cette classe en écrivant des classes d'extension. Ce n'est pas simple et nécessite une programmation basée sur des protocoles méta-objets-protocoles et des interfaces. Vous devez faire beaucoup pour y parvenir à C ++, car il ne supporte pas la réflexion hors de la boîte. Dans une telle mise en œuvre lorsque vous interrogez pour l'interface implémentées par votre nouvelle classe d'extension via le pointeur d'objet de classe d'origine, la mise en œuvre de l'objet META renvoie ce pointeur d'interface via l'objet META Class pour la classe d'extension qu'elle crée au moment de l'exécution. C'est combien de cadres d'application logicielle personnalisables (plugin) fonctionnent. Toutefois, vous devez vous rappeler que de nombreux autres mécanismes de MOP doivent être écrits pour instancier des objets méta pour toutes les classes à l'aide de dictionnaires dans lesquels les relations d'objet sont décrites et donnent les pointeurs d'interface appropriés pour les objets de classe d'origine et étendus. Dassault Systemes 'Catia V5 est écrit dans une telle architecture appelée CAA V5 où vous pouvez étendre les composants existants en écrivant de nouvelles classes d'extension avec la fonctionnalité souhaitée. P>
en C ++ Vous pouvez utiliser des fonctions libres, mais parfois des méthodes d'extension fonctionnent mieux lorsque vous nichez de nombreuses fonctions ensemble. Jetez un coup d'œil à ce code C #: Si nous devons écrire cela en C ++ à l'aide de la fonction libre, il ressemblerait à ceci: p> if (numbers | contains(5)) printf("We have a 5");
omg, c'est tellement cool
Pour une référence future, cela s'appelle «patching singe».