165 votos

¿Por qué no C# proporciona el estilo de C++ ' amigo ' palabra clave?

El C++ amigo de palabra clave que permite que un class A para designar class B como su amigo. Esto permite que Class B para acceder a las private/protected de los miembros de class A.

Nunca he leído nada de por qué esto era a la izquierda de C# (y VB.NET). La mayoría de las respuestas a esta antes de StackOverflow pregunta parece estar diciendo que es una parte útil de C++ y hay buenas razones para usarlo. En mi experiencia, yo tendría que estar de acuerdo.

Otra pregunta que me parece realmente preguntando cómo hacer algo similar a friend en una aplicación de C#. Mientras que las respuestas generalmente giran en torno a las clases anidadas, no parece tan elegante como el uso de la friend de palabras clave.

El original Diseño de Patrones libro utiliza regularmente a lo largo de sus ejemplos.

Así que en resumen, ¿por qué es friend falta de C#, y lo que es la "mejor práctica" de la forma (o formas) de la simulación en C#?

(Por cierto, la internal de palabras clave es no lo mismo, permite que todas las clases dentro de toda la asamblea de acceso internal miembros, mientras friend permite dar una cierta clase de acceso completo a exactamente una de otra clase)

81voto

Luc Hermitte Puntos 14171

En una nota de lado. Utilizando amigo no se trata de violar la encapsulación, sino que por el contrario se trata de aplicar. Como descriptores de acceso de+los modificadores, los operadores de sobrecarga, la herencia pública, downcasting, etc., es a menudo mal utilizado, pero esto no significa que la palabra clave no tiene nada, o peor, un mal propósito.

Ver Konrad Rudolph's mensaje en el otro hilo, o si usted prefiere ver la entrada correspondiente en el C++ FAQ lite.

51voto

nlaq Puntos 11379

Tener amigos en la programación es más o menos considerado "sucio" y fáciles de abuso. Rompe las relaciones entre las clases y socava algunos de los atributos fundamentales de un lenguaje OO.

Lo que se dice, es una característica muy buena y los he usado un montón de veces a mí mismo en C++; y quisiera utilizarlo en C#. Pero yo apuesto porque de C#'s "puro" OOness (frente a C++pseudo OOness) MS decidió que ya que Java no tiene ningún amigo de la palabra clave de C# no (es broma ;))

En una nota grave: interno no es tan bueno como amigo, pero no consigue el trabajo hecho. Recuerde que es raro que se puede distribuir el código para la 3ª parte de los desarrolladores que no, aunque un archivo DLL; así como el tiempo que usted y su equipo de saber sobre el interior de las clases y su uso debe estar bien.

EDITAR permítanme aclarar cómo la palabra clave friend socava la programación orientada a objetos.

Privados y protegidos de las variables y los métodos son, quizás, uno de la parte más importante de la programación orientada a objetos. La idea de que los objetos pueden contener datos o la lógica de que sólo se puede usar le permite escribir su implementación de la funcionalidad independiente de su entorno - y que su entorno no se puede modificar la información de estado que no es adecuado para manejar. Mediante el uso de amigo eres el acoplamiento de dos clases de implementaciones juntos - que es mucho peor que si solo junto a su interfaz.

36voto

Marc Gravell Puntos 482669

Para obtener información, otra cosa related-but-not-quite-the-same en .NET es [InternalsVisibleTo] , que permite realizar una Asamblea designar otro ensamblado (por ejemplo, un montaje de prueba de unidad) que (efectivamente) tiene acceso "interno" a tipos o miembros del conjunto original.

10voto

Parappa Puntos 4835

Usted debe ser capaz de lograr el mismo tipo de cosas que "amigo" se utiliza para en C++ mediante el uso de interfaces en C#. Se requiere definir explícitamente que los miembros se pasan entre las dos clases, que es trabajo extra, pero también puede hacer el código más fácil de entender.

Si alguien tiene un ejemplo de un uso razonable de "amigo" que no puede ser simulado mediante interfaces, por favor compártela! Me gustaría entender mejor las diferencias entre C++ y C#.

9voto

jeffm Puntos 2179

Te puedes acercar C++ "amigo" con C# clave "interno".

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X