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();
}