Открытый класс недоступен из-за его уровня защиты
У меня есть следующие классы:
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 недоступен из-за уровня защиты.
Но они все публичные.
Ответы
Ответ 1
Эта ошибка является результатом уровня защиты конструктора ClassB
, а не ClassB
. Поскольку имя конструктора совпадает с именем класса * ошибка может быть интерпретирована неправильно. Поскольку вы не указали уровень защиты своего конструктора, по умолчанию предполагается, что он internal
. Объявление конструктора public
устранит эту проблему:
public ClassB() { }
* Можно также сказать, что конструкторы не имеют имени, а только типа; это не меняет сути проблемы.
Ответ 2
Также, если вы хотите сделать что-то вроде ClassB.Run("thing");
, убедитесь, что метод Run();
равен static
, или вы можете называть его следующим образом: thing.Run("thing");
.
Ответ 3
Вы можете войти в конструктор веб-формы и изменить "webcontrols" на "public" вместо "protected", но я не уверен, насколько это безопасно. Я предпочитаю делать скрытые входные данные, и некоторые jQuery устанавливают значения в эти скрытые входы, а затем создают общедоступные свойства в классе веб-формы (код позади) и получают доступ к таким значениям.