2011-05-26 15 views

Respuesta

0

leer sobre C# Protected Internal

protegida Un miembro protegido es accesible dentro de su clase y clases derivadas.

interno Los tipos o miembros internos solo son accesibles dentro de los archivos en el mismo conjunto.

protegido acceso interno es limitado al conjunto actual o tipos derivados de la clase que contiene . * protected internal es la única combinación de modificadores de acceso permitida para un miembro o un tipo.

Así que hay que utilizar internal palabra clave después de todo:

protected internal memberName(){ ... }; 
+0

Pero, ¿cómo deberíamos acceder a la función de clase base solo desde la clase derivada? – Pankaj

+0

@SQL: debe declararlo como función 'protected'. –

2

Debe especificar tanto interno como protegido.

+0

Compruebe esto por favor: http://kossovsky.net/index.php/2009/06/cshar-protected-internal/ – abenci

+1

Disculpe, acabo de comprobar, tipeando Internal Protected. Se puede acceder directamente desde la clase base. clase pública Barra { vacío interno protegido MyFun() { } } Barra f = new Bar(); f.MyFun(); – Pankaj

+0

@Akash Kava: Lo siento, eso no resolverá el problema. ¡Aquí, el acceso está limitado al ensamblaje actual o los tipos derivados de la clase contenedora en cualquier lugar! –

0

Ok! Me imagino la situación en la que le gustaría tener un control más flexible de la clase de ensamblaje, y de qué clase se deriva, que con la palabra clave 'interna'. Por ejemplo, si desea verificar que el objeto proviene del ensamble th-a-at y se deriva de una de las clases de e-e-ese.

Puede hacerlo a través de Assembly.GetAssembly() método del tipo
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getassembly.aspx

Y aquí está la manera de comprobar si el objeto se deriva una de la otra.
Check if a class is derived from a generic class

Para que pueda verificar todo lo que necesita.

Entonces se puede implementar algo como:

public static bool CheckTypeIsCorrect(Type t) 
{ 
    if(t.GetAssembly().FullName != AssemblyYouNeed) return false; 
    if(!(check anything you want in the class)) return false; 
    return true; 
} 
... 
public void YourMethod(object value) 
{ 
    if(!CheckTypeIsCorrect(typeof(value))) 
     throw ArgumentException("Type of the object is not correct"); 
    ... 
} 
0

Realiza la función Access modifier como Protected en su Clase Base. Como a continuación

protected void YourFunctionName() 
{ 
//This will be accessible in your derived class only. 
} 

Un miembro protegido es accesible desde dentro de la clase en la que se declara, y desde dentro de cualquier clase derivada de la clase que declaró a este miembro.

Un miembro protegido de una clase base es accesible en una clase derivada solo si el acceso se realiza a través del tipo de clase derivada.

A continuación se muestra un ejemplo de MSDN

namespace SameAssembly 
{ 
    public class A 
    { 
     protected void abc() 
     { 
     } 
    } 

    private class B : A 
    { 
     void F() 
     { 
      A a = new A(); 
      B b = new B(); 
      a.abc(); // Error 
      b.abc(); // OK 
     } 
    } 
} 
+1

Eso no responde a la pregunta .. Y necesita especificar el modificador de acceso de sus clases .. –

+0

Está especificado como protegido para la función ya – Pankaj

+0

Pero de esta manera, todavía puede acceder a ellos desde las clases derivadas fuera del ensamblaje ! –

0

Creo que se puede hacer algo como:

public class OriginalClass { ... } 

internal class DerivedClass: OriginalClass 
{ 
    protected void MemberName() { ... } 
} 

De esta manera, sólo las clases internas pueden ver los DerivedClass y sólo internos clases derivadas pueden ver los miembros portected dentro de él.

Y también, todavía puede acceder al OriginalClass desde cualquier lugar.

+0

@devdept: Este podría satisfacer su necesidad. –

1

Dale el alcance de la clase en su interior y alcance método como protegidas

Internal class Myclass 
{ 
    Protected void MyMethod() 
    { 
     //Do something 
    } 
} 
+1

¡De esta manera usted está limitando la capacidad de acceder a todos los miembros de 'MyClass' solo a los tipos internos! –

+0

Sí. Creo que puede seguir lo que ha sugerido. –

Cuestiones relacionadas