2011-07-30 13 views
10

Conozco el error "El modificador de accesibilidad del acceso del conjunto debe ser más restrictivo que la propiedad o el indexador". También sé la solución. Simplemente no en este caso tan específico.C# - ¿Cómo mejorar la encapsulación de propiedades en este ejemplo?

Considere este ejemplo:

internal virtual bool IsFocused 
    { 
     get 
     { 
      return isFocused; 
     } 
     protected set 
     { 
      isFocused = value; 
     } 
    } 
    private bool isFocused; 

Se muestra el error. Simplemente no sé por qué. ¿Cómo es "protegido" no menos accesible que interno? ¿Cuál sería la solución a este problema? Intenté poner "interno protegido" en su lugar, sin suerte.

Respuesta

6

Como resultado, protected es más accesible que internal. Recuerde que internal significa "no visible fuera de este conjunto" (excepto a través del acceso InternalsVisibleTo, que hace que internal se parezca a public), mientras que protected es visible para todas las subclases.

+0

¿Cuál sería la solución? –

+1

La solución dependerá de lo que esté tratando de lograr en primer lugar. ¿Realmente necesitas que esta propiedad sea interna? Tal vez estás tratando de meter demasiadas responsabilidades en una sola clase/interfaz. Tal vez pueda delimitar el área de superficie 'interna' y colocarla en una clase totalmente interna por separado mientras mantiene abierta la clase de nivel superior. – bobbymcr

5

@bobbymcr tiene toda la razón en su análisis. La solución sería marcar la propiedad como internal protected. En C# eso significa que sería accesible tanto para las clases derivadas Y a todas las clases del ensamblaje actual.

Si pone internal protected como método de acceso, eso significa que es accesible para las clases derivadas. Pero toda la propiedad no es, lo que causa el error. Si marca toda la propiedad como internal protected y el método de acceso como protected, todo está bien.

internal protected virtual bool IsFocused 
{ 
    get 
    { 
     return isFocused; 
    } 
    protected set 
    { 
     isFocused = value; 
    } 
} 
private bool isFocused; 

Otra opción sería introducir protected método que se llama en la incubadora. Luego puede marcar toda la propiedad como internal y permitir anular solo ese método.

Cuestiones relacionadas