2010-11-16 21 views
10

Tengo una clase base que está marcada como abstracta. ¿Es posible hacer que un método en esa clase base solo sea visible para otras clases que heredan la clase base?C# - Cómo hacer que un método solo sea visible para las clases que heredan la clase base del método

Digamos que tengo Class1 que es mi clase base y está marcado como abstracto. Class2 Hereda Class1 y puede hacer llamadas a todos sus métodos públicos. Quiero que Class3 cree una instancia de Class2 pero no pueda hacer llamadas a ciertos métodos de Class1. Traté de marcar estos métodos como abstractos, pero luego recibo un error cuando Class2 intenta usarlos. El error es: "... No se puede declarar un cuerpo, ya que se marca como abstracto"

Respuesta

16
public abstract class Class1 
{ 
    protected abstract void Method1(); 
    public abstract void Method2(); 
} 

public class Class2 : Class1 
{ 
    protected override void Method1() 
    { 
     //Class3 cannot call this. 
    } 

    public override void Method2() 
    { 
     //class 3 can call this. 
    } 
} 

public class Class3 
{ 
    public void Method() 
    { 
     Class2 c2 = new Class2(); 
     c2.Method1(); //Won't work 
     c2.Method2(); //will work 
    } 
} 

Por qué no declarar el método protected?

+0

Exactamente lo que estaba buscando. Me olvidé de protegido! Gracias – PICyourBrain

5

Parece que está buscando la palabra clave protected. Esto limita al miembro etiquetado con protected para su uso solo para el tipo de declaración o los tipos que se derivan de ese tipo.

abstract class Class1 { 
    protected void Method1() { 
    ... 
    } 
} 

class Class2 : Class1 { 
    public void Method2() { 
    Method1(); // Legal 
    } 
} 

class Class3 { 
    public void Example() { 
    Class2 local = new Class2(); 
    local.Method2(); // Legal 
    local.Method1(); // Illegal since Method1 is protected 
    } 
} 
4

Necesitas marcarlos tanto en Clase 1 y Clase 2 como protected. Este modificador de acceso permite acceso (s) de clase (s) derivada (s) a un miembro, pero nada fuera de la clase (s) derivada (s) puede verlo.

1

Creo que quiere un protected abstract método/propiedad/campo. Sin embargo, tendrá que usar la palabra clave override en Class2 para implementarlo. Esto le da a Class2 acceso al campo (si realmente lo quiere abstracto), pero no da ninguna clase que no herede del acceso de clase 1 a esos campos.

Es el override que le dará la vuelta al mensaje Cannot declare a body....

Cuestiones relacionadas