Подтвердить что ты не робот

Открытый класс недоступен из-за его уровня защиты

У меня есть следующие классы:

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 недоступен из-за уровня защиты.

Но они все публичные.

4b9b3361

Ответ 1

Эта ошибка является результатом уровня защиты конструктора ClassB, а не ClassB. Поскольку имя конструктора совпадает с именем класса * ошибка может быть интерпретирована неправильно. Поскольку вы не указали уровень защиты своего конструктора, по умолчанию предполагается, что он internal. Объявление конструктора public устранит эту проблему:

public ClassB() { } 

* Можно также сказать, что конструкторы не имеют имени, а только типа; это не меняет сути проблемы.

Ответ 2

Также, если вы хотите сделать что-то вроде ClassB.Run("thing");, убедитесь, что метод Run(); равен static, или вы можете называть его следующим образом: thing.Run("thing");.

Ответ 3

Вы можете войти в конструктор веб-формы и изменить "webcontrols" на "public" вместо "protected", но я не уверен, насколько это безопасно. Я предпочитаю делать скрытые входные данные, и некоторые jQuery устанавливают значения в эти скрытые входы, а затем создают общедоступные свойства в классе веб-формы (код позади) и получают доступ к таким значениям.