2012-03-10 23 views
12

Duplicar posibles:
What is the difference between 'protected' and 'protected internal'?
What is the difference between Public, Private, Protected, and Nothing?Confusión: interno, protegido y protegido interna

Código es como se menciona a continuación:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace testanotherlib 
{ 
    public class A 
    { 
     internal void InternalDisplay() 
     { 
      Console.WriteLine("Internal Display Method."); 
     } 

     protected void ProtectedDisplay() 
     { 
      Console.WriteLine("Protected Display Method."); 
     } 

     protected internal void ProtectedInternalDisplay() 
     { 
      Console.WriteLine("ProtectedInternal Display Method."); 
     } 

     public void PublicDisplay() 
     { 
      Console.WriteLine("Public Display Method."); 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace testanotherlib 
{ 
    public class B : A 
    { 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using testanotherlib; 
namespace testlib 
{ 
    public class C:A 
    { 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using testlib; 
using testanotherlib; 

namespace testapp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      B objB = new B(); 
      C objC = new C(); 
     } 
    } 
} 

Estoy tratando de entender la diferencia entre en interno, protegido y protegido interno. Para eso he creado un ejemplo usando el código de arriba.

En un proyecto de biblioteca de clase testanotherlib tengo clase A & clase B. En un proyecto de biblioteca de clase testlib tengo clase C. La clase de programa está en una aplicación de consola separada. Dentro del método principal de la clase de programa, he creado un objeto para la clase B (objB) y la clase C (objC). Para objB y y objC, solo se puede acceder al método público de la clase A. Me esperaban para la clase B todos los métodos de la clase A serán accesibles. Amablemente ayúdame a entender esto. Si necesita cualquier otra información sobre el proyecto, siéntase libre de preguntarme.

Saludos, Priyank

+0

Dónde estabas esperando para poder acceder a todos los métodos de la clase A, con una referencia a una clase A? Su código nunca intenta usar * los miembros, lo que hace que sea difícil hablar de ... –

+0

@JonSkeet: esperaba poder acceder a todos los métodos de la clase A, con objB de referencia. –

+1

@PriyankThakkar: ¿De 'testApp'? * ¿Por qué * estabas esperando eso? El código en 'testApp' no está en el mismo ensamblaje que' A', por lo que los miembros internos no son visibles, por ejemplo. –

Respuesta

12

Los siguientes cinco niveles de accesibilidad se puede especificar utilizando los modificadores de acceso:

público: El acceso no está restringido.

protected: El acceso está limitado a la clase contenedora o a los tipos derivados de la clase contenedora.

Interno: El acceso está limitado al ensamblaje actual.

protected internal: El acceso está limitado al ensamblaje actual o a los tipos derivados de la clase contenedora.

privado: El acceso está limitado al tipo que lo contiene.

Taken directly from Microsoft's MSDN library.

+0

La definición que da para 'interno protegido' parece imprecisa debido a 'o'. ¿Estás seguro de que no se supone que sea 'y'? – ciuncan

+5

Puede que tengas razón. ¡Por favor, informe a Microsoft inmediatamente! –

+0

Oh, no noté el enlace, y era flojo para buscar. Lo siento. Y todavía parece bastante lógico. – ciuncan

5

internal

pueden ser vistos en las asambleas actuales y amigable.

protected

Sólo es visible dentro de las clases que heredan A.

protected internal

visible dentro de las clases que heredan A. Y también visible dentro de las asambleas actuales y amistosas.

+0

hey simon .. gracias por la ayuda :) –

+0

protegido interno significa protegido O interno; lo describiste como protegido Y interno. – Tuan

4

protected métodos y miembros solo se puede acceder desde otra clase que se deriva de la clase que declara el método previsto.

class A 
{ 
    protected void Method() {} 
} 

class B : A 
{ 
    public void Foo() 
    { 
     Method(); // works! 
    } 
} 

class C 
{ 
    public void Foo() 
    { 
     Method(); // won't work, obviously 

     var tmp = new A(); 
     tmp.Method(); // won't work either because its protected 
    } 
} 

internal hace que el método sólo visible en el mismo conjunto. Para las clases en el mismo ensamblado, el método se puede usar como si fuera público. para las clases fuera de su assebmly actual es como privado.

Ahora la combinación de protegido e interno hace que un método se pueda utilizar en el mismo conjunto para todas las clases de ese conjunto. Y el protegido hace que el método sea utilizable en todas las clases derivadas sin importar qué ensamblaje.

+0

Usted obtuvo una protección interna incorrecta, vea mi respuesta o Chris 'para el caso. – Terkel

+0

@SimonBangTerkildsen Oh, tienes razón. Corregí mi respuesta. No lo sabía. Bueno, nunca lo usé yo mismo. Así que internamente invalida la palabra clave protegida. Y el interno se ignora cuando se deriva. No lo sabía, y de hecho no me gustó :) Pero debe haber una buena razón para esto. – dowhilefor

+0

@dowhilefor: gracias por explicarlo con un ejemplo maravilloso :) :) –

Cuestiones relacionadas