2014-01-22 6 views
0

У меня возникли проблемы с доступом к свойствам базового слоя в двойном производном классе. Я включил простой пример моей проблемы ниже.Доступ к свойствам базового класса в двойном производном классе

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#, поэтому я оставлю вопрос таким, как есть, поэтому он может помочь и другим!

+0

Вы не получаете предупреждения с этим кодом, так как вы не переопределяете методы SetStatus и GetStatus? – LarsTech

+0

Вы запрограммировали в java раньше, не так ли? Это не проблема, а ООП, как правило, написано немного иначе в C#. (явным образом не назвал Get и Set) – wondra

+0

На самом деле я получаю предупреждение от Resharper о том, что я должен использовать новое ключевое слово, но код строит и вызывается правильный метод, поэтому я не думал, что это вызывает проблему. Хотя вы правы в этом, мне тоже придется это изменить. – Joost

ответ

1

Избавьтесь от методов GetStatus() и SetStatus() вообще, это не Java. вместо этого сделайте свойство virtual и переопределите его в классах потомков по мере необходимости.

public class Device 
{ 
    public Device(string status) 
    { 
     this._status = status; 
    } 

    protected _status; 
    public virtual string Status 
    { 
     get 
     { 
      return _status; 
     } 
     set 
     { 
      _status = value; 
     } 
    } 
} 

public class Light : Device 
{ 
    public Light(string status) : base(status) 
    { 
    } 
} 

public class ColoredLight : Light 
{ 
    public ColoredLight(string status) : base(status) 
    { 
    } 

    public override string Status 
    { 
     get 
     { 
      return _status; 
     } 
     set 
     { 
      _status = value; 
     } 
    } 
} 
+0

На самом деле, возможно, это упростило проблему. Метод GetStatus() является лишь примером. Фактический метод, который я использую, немного сложнее и в зависимости от значения параметра возвращает значение, специфичное для производного класса, или значение из одного из базовых классов. Теперь я попробовал его с помощью методов, объявленных как 'virtual' и' override', но это не имеет значения. По какой-то причине я не могу напрямую получить доступ к свойству из базового класса в производных классах. Я могу получить доступ к ним только с помощью некоторого метода base.GetProperty(). – Joost

+0

хорошо, см. Править –

+0

Хорошо, я думаю, что моя точная проблема была на самом деле вызвана чем-то другим. В основном глупость с моей стороны, так как я случайно определил статус как в классе Device, так и в классе Light, и не видел его, пока не изменил код на ваше решение. Пример на 'protected',' virtual' и 'override', который вы предоставили, очень помог мне с пониманием того, как я могу улучшить свой код! Так что спасибо тебе! – Joost

Смежные вопросы