2012-09-10 18 views
8

Acabo de notar algo de lo que nunca me he dado cuenta. Resulta que esta clase es válida en C#:miembro privado accesible desde otras instancias de la misma clase

class Foo 
{ 
    private string contents; 

    public Foo(string str) { 
     contents = str; 
    } 

    public void set(Foo other) 
    { 
     contents = other.contents; 
    } 
} 

Así que diferentes instancias de la misma clase pueden tener acceso a los miembros privados de uno al otro.

Hasta ahora, pensaba que un objeto solo podía acceder a los miembros privados de un objeto, no a otras instancias de la misma clase. Es un poco sorprendente descubrir esto.

¿Es este el caso en todos los lenguajes orientados a objetos comunes? No es intuitivo para mí.

+0

Resulta que alguien ya hizo una pregunta bastante similar: http://stackoverflow.com/questions/346127/access-private-member-variable-of-the-class-using-its-object-instance?rq= 1. Sin embargo, las respuestas a eso no dan una razón autoritativa para esta elección de diseño. ¿Es solo porque hacerlo de manera diferente es ineficiente/imposible? – Oliver

Respuesta

8

Esto es lo mismo que en C++ y Java: el control de acceso funciona por clase, no por objeto.

En C++, el control de acceso de Java y C# se implementa como una característica estática de tiempo de compilación. De esta manera, no da ningún tiempo de ejecución por encima. Solo el control por clase se puede implementar de esa manera.

+1

¿Por qué es este el caso? ¿No puede el compilador simplemente prohibir llamar a un método privado en otra cosa que no sea la referencia 'this' (implícita o explícita)? Significaría que no se pueden invocar métodos privados sobre otras variables que se refieren a 'this', pero no veo ninguna desventaja de eso. Creo que la respuesta de japreiss es más correcta. – herman

11

¿Cómo harías un constructor de copia para una clase que no expone todo su estado interno a través de métodos públicos?

considerar algo como esto:

class Car 
{ 
public: 
    void accelerate(double desiredVelocity); 
    double velocity() const; 
private: 
    Engine myEngine; 
}; 

El Car 's interfaz pública no expone su Engine, pero es necesario que se haga una copia.

+0

Sí; esta. No habría otra forma decente para hacer métodos de copia/clonación. Podrías protegerlo internamente si estuvieras preocupado de que se acceda de alguna manera fuera del ensamblaje o algo así. – Nikki9696

+0

También es necesario para implementar equals(). – herman

Cuestiones relacionadas