2010-11-16 11 views
10

Ho una classe base contrassegnata come astratta. È possibile rendere un metodo in quella classe base visibile solo ad altre classi che ereditano la classe base?C# - Come rendere un metodo visibile solo alle classi che ereditano la classe base del metodo

Dire che ho Class1 che è la mia classe base ed è contrassegnato come astratto. Class2 eredita Class1 e può effettuare chiamate a tutti i suoi metodi pubblici. Voglio Class3 per creare un'istanza di Class2 ma non essere in grado di effettuare chiamate a determinati metodi di Class1. Ho provato a contrassegnare questi metodi come se fossero astratti, ma poi ottengo un errore quando Class2 tenta di usarli. L'errore è: "... non può dichiarare un corpo perché è contrassegnato come astratto"

risposta

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 
    } 
} 

Perché non dichiarare il metodo protected?

+0

Esattamente quello che stavo cercando. Ho dimenticato la protezione! Grazie – PICyourBrain

5

Sembra che stiate cercando la parola chiave protected. Ciò limita il membro taggato con protected per l'utilizzo solo per il tipo o i tipi di dichiarazione che derivano da quel 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

è necessario marcare loro sia in Class1 e Class2 come protected. Questo modificatore di accesso consente l'accesso alla classe derivata (es) a un membro, ma nulla al di fuori della (e) classe (i) derivata può vederlo.

1

Utilizzare la parola chiave protected.

1

Penso che tu voglia un metodo/proprietà/campo protected abstract. Dovrai usare la parola chiave override in Class2 per implementarla, comunque. Questo dà accesso al campo a Class2 (se lo vuoi veramente astratto), ma non dà alcuna classe che non erediti dall'accesso di classe 1 a quei campi.

È il override che ti porterà in giro il messaggio Cannot declare a body....

Problemi correlati