2012-10-12 74 views
5

Duplicar posible:
c# internal abstract class, how to hide usage outside assembly¿Cómo ocultar una clase con una palabra clave interna?

que tienen una Asamblea común/proyecto que tiene varias clases abstractas. Cuando creo un nuevo conjunto, el desarrollador debe derivar de las clases MathProblem y MathProblemTemplate<T>.

tanto, creo que la clase MathProblemTemplate puede ser internal, me refiero a cuando se va a establecer una clase base a una clase concreta, no se muestran en intelisense la clase MathProblemTemplate, pero sí para 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(); 
} 

Es esto posible?

+0

¿Ha leído [esta pregunta pertinente] (http://stackoverflow.com/questions/1244953/c-sharp-internal-abstract-class -how-to-hide-usage-outside-assembly) que aparecieron en la lista cuando hizo su pregunta? –

+0

Sí, lo he leído, pero sigo recibiendo errores como: Accesibilidad incoherente: la clase base 'DevNinja.Core.Models.MathProblemTemplate' es menos accesible que la clase 'DevNinja.Core.Models.MathProblemTemplate ' –

+0

Hmm, sí, estás usando plantillas que lo hacen diferente. –

Respuesta

3

No se puede, la razón es que MathProblemTemplate<T> es público, por lo tanto, cualquier clase de la que herede también debe ser pública.

Se podía quitar MathProblemTemplate y mover cualquier código en él en MathProblemTemplate<T>

+0

Pero necesito una referencia de él en el constructor MathProblem, esa es la razón por la que realmente necesito el genérico –

+0

En ese caso, es posible que tenga que hacer MathProblem genérico y luego proporcionar el MathProblemTemplate genérico, p. 'clase abstracta pública MathProblem : Pregunta {public MathProblem (plantilla MathProblemTemplate ) {}}' –

+0

Pero sería redundante porque esto debería ser una MathProblemTemplate. ¿No lo crees? –

Cuestiones relacionadas