公共类由于其保护级别而无法访问

本文关键字:访问 保护 于其 | 更新日期: 2023-09-27 18:28:50

我有以下类:

namespace Bla.Bla 
{
    public abstract class ClassA 
    {
        public virtual void Setup(string thing) 
        {
        }
        public abstract bool IsThingValid();
        public abstract void ReadThings();
        public virtual void MatchThings() { }
        public virtual void SaveThings() { }
        public void Run(string thing) 
        {
            Setup(thing);
            if (!IsThingValid()) 
            {
            }
            ReadThings();
            MatchThings();
            SaveThings();
        }
    }
}
namespace Bla.Bla 
{
    public class ClassB : ClassA 
    {
        ClassB() { } 
        public override void IsThingValid() 
        {
            throw new NotImplementedException();
        }
        public override void ReadThings() 
        {
            throw new NotImplementedException();
        }
    }
}

现在我试着做以下事情:

public class ClassC 
{
    public void Main() 
    {
        var thing = new ClassB();
        ClassB.Run("thing");
    }
}

返回以下错误:ClassB由于其保护级别而无法访问。

但它们都是公开的。

公共类由于其保护级别而无法访问

此错误是ClassB构造函数的保护级别造成的,而不是ClassB本身。由于构造函数的名称与类*的名称相同,因此可能会错误地解释错误。由于您没有指定构造函数的保护级别,因此默认情况下假定为internal。声明构造函数public将解决此问题:

public ClassB() { } 

*也可以说构造函数没有名称,只有类型;这并不能改变问题的本质。

此外,如果您想执行类似ClassB.Run("thing");的操作,请确保方法Run();static,或者您可以这样调用它:thing.Run("thing");

您可以进入web表单的设计器,将"webcontrols"更改为"public"而不是"protected",但我不确定这有多安全。我更喜欢进行隐藏输入,并让一些jQuery将值设置到这些隐藏输入中,然后在web表单的类中创建公共属性(代码隐藏),并以这种方式访问值。