¿Por qué C# no proporciona la palabra clave "amigo" de estilo C++? [cerrado]

Resuelto Ash asked hace 15 años • 22 respuestas

La palabra clave amigo de C++ permite class Adesignar a a class Bcomo su amigo. Esto permite Class Bacceder a los miembros private/ protectedde class A.

Nunca leí nada sobre por qué esto se dejó fuera de C# (y VB.NET). La mayoría de las respuestas a esta pregunta anterior de StackOverflow parecen decir que es una parte útil de C++ y que hay buenas razones para usarlo. En mi experiencia, tendría que estar de acuerdo.

Me parece que otra pregunta es realmente cómo hacer algo similar frienden una aplicación C#. Si bien las respuestas generalmente giran en torno a clases anidadas, no parece tan elegante como usar la friendpalabra clave.

El libro original Design Patterns lo utiliza regularmente en todos sus ejemplos.

Entonces, en resumen, ¿por qué friendfalta en C# y cuál es la forma (o formas) de "mejores prácticas" de simularlo en C#?

(Por cierto, la palabra clave nointernal es lo mismo, permite que todas las clases dentro de todo el conjunto accedan a los miembros, mientras que le permite otorgar a una determinada clase acceso completo exactamente a otra clase)internalfriend

Ash avatar Oct 15 '08 10:10 Ash
Aceptado

En otros comentarios. Usar friend no se trata de violar la encapsulación, sino por el contrario, se trata de hacerla cumplir. Como accesos+mutadores, sobrecarga de operadores, herencia pública, downcasting, etc. , a menudo se usa mal, pero eso no significa que la palabra clave no tenga, o peor aún, un mal propósito.

Consulte el mensaje de Konrad Rudolph en el otro hilo o, si lo prefiere, consulte la entrada correspondiente en las preguntas frecuentes sobre C++.

Luc Hermitte avatar Oct 15 '2008 10:10 Luc Hermitte

Tener amigos en la programación se considera más o menos "sucio" y fácil de abusar. Rompe las relaciones entre clases y socava algunos atributos fundamentales de un lenguaje OO.

Dicho esto, es una característica interesante y la he usado muchas veces en C++; y también me gustaría usarlo en C#. Pero apuesto a que debido a la OOness "pura" de C# (en comparación con la pseudo OOness de C++), MS decidió que, como Java no tiene una palabra clave amiga, C# tampoco debería (es broma;))

Hablando en serio: interno no es tan bueno como amigo pero hace el trabajo. Recuerde que es raro que distribuya su código a desarrolladores externos que no sean a través de una DLL; Así que, siempre que usted y su equipo sepan acerca de las clases internas y su uso, todo estará bien.

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

Las variables y métodos privados y protegidos son quizás una de las partes más importantes de la programación orientada a objetos. La idea de que los objetos pueden contener datos o lógica que solo ellos pueden usar le permite escribir su implementación de funcionalidad independientemente de su entorno, y que su entorno no puede alterar la información de estado que no es adecuado para manejar. Al utilizar friend, estás acoplando las implementaciones de dos clases, lo cual es mucho peor que si simplemente acoplaras su interfaz.

 avatar Oct 15 '2008 03:10