C# le partage de code entre les classes
Dans Visual Studio 2008 à l'aide de C#, quelle est la meilleure façon de partager du code entre plusieurs classes et les fichiers sources?
L'héritage n'est pas la solution que les classes déjà avoir un sens de la hiérarchie.
Est-il une fonction propre qui est comme un C d'inclure le fichier qui vous permettra d'insérer le code n'importe où vous voulez dans une autre classe?
EDIT:
ok, je suppose que nous avons besoin d'un exemple concret...
Il y a plusieurs centaines de classes dans le domaine avec un bien pensé de la classe hiérarchie. Maintenant, la plupart de ces classes ont besoin d'imprimer. Il existe un utilitaire d'imprimante de la classe qui gère l'impression. Disons qu'il y a 3 différentes méthodes d'impression qui dépendent de la classe qui est en cours d'impression. Le code qui appelle la méthode print (6 lignes) est ce que j'essaie d'éviter le copier-coller sur tous les différents clients de la classe de pages.
Ce serait bien si les gens ne présumez pas qu'ils en savaient plus sur le domaine que l'op - surtout quand ils mentionnent spécifiquement les techniques qui ne correspondent pas...
Pourriez-vous nous montrer le 6 lignes que vous souhaitez dupliquer?
je ne suis pas sûr de ce qu'un mélange est
Un mix-in est un ensemble de méthodes qui peuvent être mélangées dans une autre classe sans que les autres classes ayant pour dériver à partir d'une classe avec des méthodes. Je pense que le plus proche que vous pouvez obtenir en C# sont des méthodes d'extension. Jetez un oeil à ces!
grâce dtb - ceux qui sont le plus proche de ce que j'ai été à la recherche pour. le problème est que l'appel de la méthode ressemble à l'intérieur d'une des valeurs de l'objet avant de l'appeler, mais je suis peut-être capable de travailler autour de cela. merci de poster une réponse si je peux marquer.
OriginalL'auteur mson | 2009-12-10
Vous devez vous connecter pour publier un commentaire.
Si vous avez des fonctionnalités que vous utilisez le plus fréquemment dans les classes qui représentent des choses très différentes, dans mon expérience, qui devrait tomber dans quelques catégories:
Pour utilitaire-type de fonctionnalités que vous devez envisager la création de classes séparées, et le référencement de l'utilité des classes en cas de besoin dans la classe d'affaires.
Pour les sujets transversaux tels que l'exploitation forestière ou de la sécurité, je vous suggère d'étudier Aspect-Oriented Programming.
Concernant la PrintA vs PrintB exemple discuté dans d'autres commentaires, il sonne comme une excellente affaire pour le Modèle de Fabrique. Vous définissez une interface, par exemple, IPrint, les classes PrintA et PrintB qui mettent en œuvre IPrint, et de lui affecter une instance de IPrint basé sur ce que la page en particulier des besoins.
+1 C'est également ce que je voudrais mettre en œuvre. Si l'Héritage doesnt costume alors le prochain choix serait de se pencher sur l'Agrégation.
Avez-vous utilisé MEF/avoir une opinion? J'ai récemment travaillé dans l'Java/Printemps de l'environnement et n'ont pas eu la chance d'essayer le MEF.
OriginalL'auteur Eric J.
Vous ne pouvez pas il suffit de charger dans le code que vous souhaitez être ajouté dans une classe en C# via une directive de préprocesseur comme vous le feriez dans C.
Vous pouvez, cependant, de définir une interface et de déclarer les méthodes d'extension pour cette interface. L'interface pourrait alors être mis en œuvre par vos classes, et vous pouvez appeler les méthodes de vulgarisation sur ces classes. E. g.
Cela vous permettrait de réutiliser les fonctionnalités, mais vous ne pouvez pas accéder aux membres privés de la classe, comme vous pourrez si vous le pouvez, dire, hash inclure un fichier.
Nous avons besoin de nous des exemples plus concrets de ce que vous voulez faire si?
OriginalL'auteur Khanzor
Un C# classe utilitaire fonctionne. Il agit comme un registre central pour la commune de code (ou comme le VB.NET Module de construire) - il doit contenir le code qui n'est pas spécifique à une classe, sinon il doit avoir été attaché à la catégorie concernée.
Vous ne pas souhaitez commencer la copie du code source si vous n'avez pas, parce que cela conduirait à la mise à jour du code de problèmes compte tenu de la duplication.
Tant que la source n'a pas besoin de conserver de l'état, puis utiliser une classe statique avec la méthode statique.
Je ne suggère pas très différente (par exemple, Microsoft RegEx de la classe) que l'on ne peut pas être n'importe quoi, mais une dépendance matérielle et viole le principe de responsabilité unique. L'auteur n'a pas spécifier ce qui doit être réutilisés si cette suggestion est tout aussi valable que l'autre. Certainement avec des bribes et de fragments nous n'avons pas besoin d'être aveuglé par des motifs ou de spéculer sur l'expertise.
OriginalL'auteur John K
Si les classes sont dans le même espace de noms, il n'y a pas besoin de l'inclure analogique. Appelez simplement les membres de la classe définie dans l'autre fonction.
Si ils ne sont pas dans le même espace de noms, ajouter l'espace de noms des classes que vous souhaitez utiliser dans les directives de l'usage et il devrait fonctionner de la même que ci-dessus.
Je suis confus par la question: il semble que vous devez travailler sur votre base OO compréhension.
OriginalL'auteur antik
La caisse des méthodes d'extension: http://msdn.microsoft.com/en-us/library/bb383977.aspx
OriginalL'auteur Jerry Fernholz
Je ne sais pas de manière à inclure des portions de fichiers, mais une chose que nous avons souvent de faire est d'ajouter un fichier existant et de "lien" à partir de son emplacement actuel. Par exemple, nous avons une assemblyInfo.cs fichier que chaque projet fait référence à partir d'une solution d'annuaire. Nous changeons une fois tous les projets ont la même info, car ils font référence au même fichier.
Sinon, des suggestions à propos de refactoring "commun" routines dans un common.dll sont la meilleure chose que j'ai trouvé .Net.
OriginalL'auteur No Refunds No Returns
Je ne suis pas sûr exactement ce que vous entendez par "significatif" de la structure déjà, mais cela sonne comme un endroit où l'on pouvait utiliser de la classe de base de la mise en œuvre. Bien que pas aussi "verbose", comme le C++ à l'héritage multiple, vous pourriez obtenir quelques avantages de l'utilisation de enchaînés de la classe de base de la mise en œuvre de la réutilisation des fonctions communes.
Vous pouvez préserver la hiérarchie de classe, au moins visuellement et remplacer le comportement si nécessaire.
Les classes de Base n'avez pas nécessairement besoin d'être "PersonBase", etc. Ils peuvent être "PersistableBase", etc. En C++, on aurait un nombre de classe prototypes nous importer, et regroupent ensemble, en C#, nous avons à faire à travers la seule lignée de l'héritage et interfaces (par pure de la POO). La langue permet d'utiliser des classes partielles, les méthodes d'extension (au-dessus de 2,0), etc. Cela dépend vraiment de votre objet graphique. Est-il une raison pourquoi vous ne pouvez pas recomposer les objets à utiliser les autres techniques mentionnées?
OriginalL'auteur GrayWizardx
Tirez le code répétitif dans les services. Le code répétitif est un indice qu'il pourrait y avoir un peu de place pour le refactoring.
Par exemple, créer un "PrintingService" qui contient la logique nécessaire à l'impression. Vous pouvez alors les classes qui ont besoin d'imprimer ont une dépendance de ce service (que ce soit par le constructeur ou un paramètre à une méthode qui demande le service).
Une autre astuce que j'ai le long de ces lignes est de créer des interfaces pour des fonctionnalités de base et ensuite utiliser les interfaces de code contre. Par exemple, j'ai eu des tas de rapport de classes de laquelle l'utilisateur peut, soit par télécopieur, par courriel ou l'imprimer. Au lieu de créer des méthodes pour chaque, j'ai créé un service pour chacun d'eux, a leur mettre en œuvre une interface qui a une méthode unique de Sortie(). Je ne puis passer chaque service à la même méthode en fonction du type de sortie, l'utilisateur voulu. Lorsque le client veut utiliser eFax au lieu de la télécopie par le biais du modem, c'était juste une question de l'écriture d'un nouveau service mis en œuvre cette même interface.
eh bien j'ai toujours apprécié la lecture de tout à l'heure pour une valeur éducative
OriginalL'auteur Josh
Pour être honnête, je ne peux pas penser à quelque chose comme inclut dans Visual C#, ni pourquoi vous voulez cette fonction. Cela dit, les classes partielles peut faire quelque chose comme il sonne ce que vous voulez, mais leur utilisation peut-être affrontements contre votre "classes déjà avoir un sens de la hiérarchie.
Investir plus de temps dans votre hiérarchie. Cela ressemble à ce que vous avez besoin est à retravailler votre structure d'héritage afin que les objets qui utilisent printA sont toutes issues d'une commune membre et le même est vrai pour les objets qui utilisent printB
Il semble que vous pourriez voulez une Imprimante de classe, qui a deux méthodes, soit de ce qui vous pouvez appeler au besoin.
Désolé, mais je suis toujours pas à voir pourquoi vous ne pourriez pas mettre en œuvre à la fois printA() et printB() que des méthodes dans certains utilitaire de la classe, puis d'appeler la méthode correcte à partir de différentes pages appropriées?
OriginalL'auteur Coxy
Vous avez beaucoup d'options, TT, méthode d'extension, délégué, et lambda
Lisez à propos de LINQ, il utilise beaucoup de la méthode d'extension, délégué, et lambda de réutiliser du code, sans un "parent/abstrait" de la classe
OriginalL'auteur Dennis C