У меня возникли проблемы с доступом к свойствам базового слоя в двойном производном классе. Я включил простой пример моей проблемы ниже.Доступ к свойствам базового класса в двойном производном классе
public class Device
{
public Device(string status)
{
Status = status;
}
public string Status { get; set; }
public void SetStatus(string value)
{
Status = value;
}
public string GetStatus()
{
return Status;
}
}
public class Light : Device
{
public Light(string status) : base(status)
{
}
public void SetStatus(string value)
{
base.SetStatus(value)
}
public string GetStatus()
{
return Status;
}
}
public class ColoredLight : Light
{
public ColoredLight(string status) : base(status)
{
}
public void SetStatus(string value)
{
base.SetStatus(value)
}
public string GetStatus()
{
return Status;
}
}
// note: The derived classes also have some properties of their own, of course,
// but they are not needed to illustrate the problem
Я знаю свойство статуса BaseClass определенно получает набор на значение, но если я вызываю метод GetStatus в классе ColoredLight возвращает нуль.
Если я изменил функции GetStatus в классе Light и ColoredLight, чтобы вернуть base.GetStatus(), он вернет правильное значение. Однако я думал, что должно быть возможно получить доступ к свойствам базового элемента непосредственно в производных классах. Я делаю что-то неправильно? Или это именно то, как это должно быть сделано?
Заранее благодарим за помощь.
Редактировать: [Решено] Проблема, с которой я столкнулась, была связана с глупостью и надзором, поскольку я объявлял свойство Status как в классе Device, так и в Light. Однако нижеприведенные решения улучшили мое понимание использования «защищенных», «виртуальных» и «переопределенных» в C#, поэтому я оставлю вопрос таким, как есть, поэтому он может помочь и другим!
Вы не получаете предупреждения с этим кодом, так как вы не переопределяете методы SetStatus и GetStatus? – LarsTech
Вы запрограммировали в java раньше, не так ли? Это не проблема, а ООП, как правило, написано немного иначе в C#. (явным образом не назвал Get и Set) – wondra
На самом деле я получаю предупреждение от Resharper о том, что я должен использовать новое ключевое слово, но код строит и вызывается правильный метод, поэтому я не думал, что это вызывает проблему. Хотя вы правы в этом, мне тоже придется это изменить. – Joost