2012-10-12 9 views
5

Eventuali duplicati:
c# internal abstract class, how to hide usage outside assemblyCome nascondere una classe usando la parola chiave interna?

Ho un'assemblea comune/progetto che ha diverse classi astratte. Quando creo un nuovo assembly, lo sviluppatore dovrebbe derivare dalle classi MathProblem e MathProblemTemplate<T>.

Quindi, credo che la classe MathProblemTemplate può essere internal, voglio dire quando si prevede di impostare una classe base a una classe concreta, non mostrano nel intellisense classe MathProblemTemplate, ma sì per MathProblemTemplate<T>

// Question classes 
public abstract class Question 
{ 
    protected QuestionTemplate Template { get; private set; } 

    public Question(QuestionTemplate template) 
    { 
     this.Template = template; 
    } 
} 

public abstract class MathProblem : Question 
{ 
    public MathProblem(MathProblemTemplate template) 
     : base(template) 
    { 
    } 
} 

// QuestionTemplate classes 
public abstract class QuestionTemplate 
{ 
    public QuestionTemplate() { } 
} 

// This is the class which I'd like to hide 
public abstract class MathProblemTemplate : QuestionTemplate 
{ 
} 

public abstract class MathProblemTemplate<T> : MathProblemTemplate 
{ 
    protected abstract T Method1(); 
    protected abstract T Method2(); 
} 

Is questo possibile?

+0

Hai letto [tale questione rilevante] (http://stackoverflow.com/questions/1244953/c-sharp-internal-abstract-class -how-to-hide-usage-outside-assembly) che è comparso nell'elenco quando hai posto la tua domanda? –

+0

Sì, l'ho letto, ma sto ancora ricevendo errori come: Accessibilità incoerente: la classe base 'DevNinja.Core.Models.MathProblemTemplate' è meno accessibile della classe 'DevNinja.Core.Models.MathProblemTemplate ' –

+0

Hmm, sì, stai usando dei modelli che lo rendono diverso. –

risposta

3

Non è possibile, il motivo è che MathProblemTemplate<T> è pubblico, quindi qualsiasi classe ereditata da deve anche essere pubblica.

Si potrebbe semplicemente rimuovere MathProblemTemplate e spostare qualsiasi codice in MathProblemTemplate<T>

+0

Ma ho bisogno di un riferimento da esso nel costruttore MathProblem, questo è il motivo per cui ho davvero bisogno del generico –

+0

In tal caso, potrebbe essere necessario rendere MathProblem generico e quindi fornire il MathProblemTemplate generico, ad es. 'classe astratta pubblica MathProblem : Domanda {public MathProblem (MathProblemTemplate modello) {}}' –

+0

Ma sarebbe ridondante perché questo dovrebbe essere un MathProblemTemplate. Non la pensi così? –