C# 如何使用内部关键字隐藏类?

C# 如何使用内部关键字隐藏类?,c#,oop,class,abstract-class,internal,C#,Oop,Class,Abstract Class,Internal,可能重复: 我有一个公共程序集/项目,它有几个抽象类。当我创建一个新程序集时,开发人员应该从MathProblem和MathProblemTemplate类派生 因此,我猜类MathProblemTemplate可以是internal,我的意思是,当您计划将基类设置为一个具体的类时,不会在智能意义上显示类MathProblemTemplate,但是对于MathProblemTemplate //问题类 公共抽象类问题 { 受保护的问题模板模板{get;private set;} 公开问题(问题

可能重复:

我有一个公共程序集/项目,它有几个抽象类。当我创建一个新程序集时,开发人员应该从
MathProblem
MathProblemTemplate
类派生

因此,我猜类
MathProblemTemplate
可以是
internal
,我的意思是,当您计划将基类设置为一个具体的类时,不会在智能意义上显示类
MathProblemTemplate
,但是对于
MathProblemTemplate

//问题类
公共抽象类问题
{
受保护的问题模板模板{get;private set;}
公开问题(问题模板)
{
this.Template=Template;
}
}
公共抽象类数学问题:问题
{
公共数学问题(MathProblemTemplate模板)
:基础(模板)
{
}
}
//问题模板类
公共抽象类模板
{
公共问题模板(){}
}
//这是我想隐藏的类
公共抽象类MathProblemTemplate:QuestionTemplate
{
}
公共抽象类MathProblemTemplate:MathProblemTemplate
{
受保护的抽象T方法1();
受保护的抽象T方法2();
}

这可能吗?

您不能,原因是
MathProblemTemplate
是公共的,因此它从中继承的任何类也需要是公共的


您可以删除
MathProblemTemplate
并将其中的任何代码移动到
MathProblemTemplate

中。您是否阅读了您提出问题时列表中显示的代码?是的,我已经阅读了,但我仍然会遇到一些错误,比如:不一致的可访问性:基类“devnija.Core.Models.MathProblemTemplate”比类“devnija.Core.Models.MathProblemTemplate”更难访问。嗯,是的,你使用的模板使它与众不同。除了讨厌的friends hack之外,@TomWijsman提到的问题的答案,说你不能这么做。如果您想从另一个程序集中的类派生,它必须是公共的。我的目的只是显示泛型类并隐藏非泛型类,但我需要在MathProblem构造函数中引用它,这就是我在这种情况下真正需要泛型的原因,您可能必须将MathProblem设置为泛型,然后提供泛型MathProblemTemplate,例如
公共抽象类MathProblem:Question{public MathProblemProblem(MathProblemTemplate){}
,但这是多余的,因为这应该是MathProblemTemplate。你不这么认为吗?你在通用版本中使用什么类型?
// 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(); 
}