2010-05-20 15 views
8

Si tengo una clase con un método, quiero protected y internal. Quiero que solo las clases derivadas en el ensamblado puedan llamarlo.¿Qué elige, protegido o interno?

Desde protected internal significa protectedointernal, usted tiene que tomar una decisión. ¿Qué elige en este caso - protected o internal?

Respuesta

5

Quiero que las clases derivadas únicamente en la asamblea serían capaces de llamarlo.

Bueno, entonces tiene dos opciones. Puede protegerlo, y cada vez que uno de sus clientes amplíe su clase y llame a su método y lo averigüe, puede escribirle una carta con una redacción severa diciéndole que deje de hacerlo. O puede hacerlo de manera interna y hacer revisiones de código del código de sus compañeros de trabajo para asegurarse de que no usen el método que se supone que no deben usar.

Supongo que este último es el más barato y más fácil de hacer. Lo haría interno.

+3

** Posiblemente haya una tercera opción. ** El OP podría hacer que * toda la clase * sea interna, en cuyo caso el acceso 'protegido' en el método lograría el comportamiento deseado. El código fuera del ensamblado podría acceder a la funcionalidad de la clase a través de una interfaz pública. Eso puede ser suficiente para lograr el comportamiento deseado de OP. La desventaja, por supuesto, es que toda la herencia fuera de la asamblea estaría prohibida ... pero el OP explícitamente no indica que es un requisito. – LBushkin

3

Creo que la elección correcta es internal. De esta forma puede proteger a las personas fuera de su ensamblado para que no llamen a este método, y esto solo lo deja a usted tener cuidado y solo llama a este método desde las clases derivadas. Es más fácil tener cuidado en la asamblea que escribes que esperar que otras personas tengan cuidado cuando lo usan.

+2

Más información aquí: http://blogs.msdn.com/ericlippert/archive/2008/04/24/why-can-ti-access-a-protected-member-from-a-derived-class-part -three.aspx –

6

Personalmente elegiría protegido. Si las subclases en su propio ensamblaje son lo suficientemente buenas como para llamar al método, ¿por qué no una subclase en otro ensamblado? Quizás podría refactorizar la funcionalidad en una clase separada (interna) por completo.

Realmente necesita pensar objetivamente sobre el propósito del método. La accesibilidad interna casi siempre me parece mal. Principalmente debido a mi experiencia tratando de derivar de controles o clases en el framework .NET donde me topé con una pared de ladrillo porque alguien decidió marcar una clase o como interna. El autor original nunca notó que no tener acceso a ese método dificultaba mucho la implementación de una subclase.

EDITAR

Para aclarar, accesibilidad interna para una clase es muy útil y yo no estaba dando a entender interior en general es malo. Mi punto era que los métodos internos en una clase que de otro modo sería pública me parecen erróneos. Una clase base diseñada correctamente no debe dar una ventaja injusta a las clases derivadas en el mismo ensamblado.

+2

+1 de mi parte. No creo que haya tenido que usar 'internal'. – Kobi

+0

¿Qué hay de los casos en los que tiene una reflexión sobre las clases de ensamblaje y si la subclase no se reflejará (porque está fuera del ensamblaje), este método no funcionará correctamente? – brickner

+0

Pregunta fácil. Nunca tuve que usar la reflexión ya sea ':)' – Kobi

1

Es una decisión tan estrafalaria hacer protected internal decir protected O internal. Para este caso preciso usaría internal. La razón es que si la encapsulación se rompe, prefiero que sea yo, más bien que alguien que no esté bajo mi control.

0

Creo que la respuesta varía en función de sus necesidades. Si yo fuera usted, me gustaría hacer algo como esto:

public class YourClass 
    { 
     protected class InnerClass 
     { 
      internal void YourMethod() 
      { 
       // Your Code 
      } 
     } 
    } 
Cuestiones relacionadas