213 votes

Pourquoi est-ce que C# ne pas fournir le style C++ " ami " mot-clé?

Le C++ ami mot-clé permet à l' class A de désigner class B comme son ami. Cela permet d' Class B pour accéder à l' private/protected des membres de l' class A.

Je n'ai jamais lu quoi que ce soit pour expliquer pourquoi il a été laissé de C# (et VB.NET). La plupart des réponses à cette plus tôt StackOverflow question semblent dire que c'est une partie utile de C++ et il y a de bonnes raisons de l'utiliser. Dans mon expérience, je serais d'accord.

Une autre question me semble être vraiment savoir comment faire quelque chose de similaire friend dans une application C#. Bien que les réponses généralement tournent autour de classes imbriquées, il ne semble pas tout à fait élégant, à l'aide de l' friend mot-clé.

L'origine des Modèles de Conception de livre utilise régulièrement tout au long de ses exemples.

Donc en résumé, pourquoi est - friend manquants à partir de C#, et quelle est la "meilleure pratique" (ou les moyens) de la simulation en C#?

(En passant, l' internal mot-clé n'est pas la même chose, il permet à toutes les catégories à l'intérieur de l'ensemble de l'assemblée pour accéder internal des membres, tandis que d' friend vous permet de donner une certaine classe de l'accès complet à exactement une autre classe)

105voto

Luc Hermitte Points 14171

Sur une note de côté. À l'aide de l'ami n'est pas sur la violation de l'encapsulation, mais, au contraire, c'est à propos de l'appliquer. Comme accesseurs+mutateurs, la surcharge des opérateurs, patrimoine public, de passer, etc., il est souvent utilisé à mauvais escient, mais cela ne signifie pas le mot-clé n'a pas, ou pire, un mauvais but.

Voir Konrad Rudolph' message dans l'autre thread, ou si vous préférez voir l'entrée correspondante dans le C++ FAQ lite.

70voto

nlaq Points 11379

Avoir des amis dans la programmation est plus ou moins considéré comme "sale" et facile à des abus. Il rompt les relations entre les classes et de sape de certains attributs essentiels d'un langage OO.

Cela étant dit, il est une fonctionnalité intéressante et je l'ai utilisé beaucoup de fois moi-même en C++, et que vous souhaitez l'utiliser en C#. Mais je parie que parce que du C#'s "pure" OOness (par rapport à C++'pseudo OOness) MS a décidé que, parce que Java n'a pas d'ami de mots clés de C# ne devrait pas non plus (je plaisante ;))

Sur une note plus sérieuse: interne n'est pas aussi bon que ami mais il ne faire le travail. Rappelez-vous qu'il est rare que vous allez distribuer votre code à la 3e partie des développeurs de pas si une DLL; donc, tant que vous et votre équipe, à savoir sur l'intérieur des classes et de leur utilisation, vous devriez être bien.

EDIT Permettez-moi de clarifier comment l'ami de mot-clé de sape de la POO.

Privés et protégés de variables et de méthodes sont peut-être la partie la plus importante de la programmation orientée objet. L'idée que les objets peuvent contenir des données ou de la logique qu'ils sont seuls à utiliser vous permet d'écrire votre mise en œuvre de la fonctionnalité de votre environnement et de votre environnement ne peuvent pas modifier les informations d'état qu'il n'est pas apte à gérer. En utilisant un ami, vous êtes le couplage de deux classes de mise en œuvre, ensemble - ce qui est bien pire, alors si vous venez couplé à leur interface.

50voto

Marc Gravell Points 482669

Pour info, un autre-mais-pas-vraiment-la-même chose .NET est - [InternalsVisibleTo], ce qui permet à l'assemblée de désigner une autre assemblée (comme un test de l'unité de l'assemblée) (efficacement) a "interne" de l'accès à des types/membres de l'assemblée.

13voto

Parappa Points 4835

Vous devriez être en mesure d'accomplir les mêmes sortes de choses, que "l'ami" est utilisé pour en C++ en utilisant les interfaces en C#. Il vous oblige à définir explicitement les membres qui sont passés entre les deux classes, ce qui est du travail supplémentaire, mais peut aussi rendre le code plus facile à comprendre.

Si quelqu'un a un exemple d'une utilisation raisonnable des "ami" qui ne peuvent pas être simulés à l'aide d'interfaces, merci de le partager! J'aimerais mieux comprendre les différences entre C++ et C#.

8voto

jeffm Points 2179

Vous pouvez obtenir près de C++ "ami" avec le C# mot-clé "interne".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X