在双派生类中访问基类的属性

时间:2014-01-22 17:47:07

标签: c# properties base derived

我无法在双派生类中访问基类的属性。我在下面列出了一个简单的问题示例。

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的Status属性肯定被设置为一个值,但是如果我在ColoredLight类中调用GetStatus方法,它将返回null。

如果我更改Light和ColoredLight类中的GetStatus函数以返回base.GetStatus(),它确实返回正确的值。但是,我认为应该可以直接在派生类中访问基类的属性。难道我做错了什么?或者这是应该怎么做的?

提前感谢您的帮助。

编辑:[解决]我遇到的问题是由于我的愚蠢和疏忽,因为我在Device和Light类中都声明了Status属性。但是,下面的解决方案提高了我对C#中“受保护”,“虚拟”和“覆盖”的使用的理解,所以我将保留问题,所以它也可以帮助其他人!

1 个答案:

答案 0 :(得分: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;
        }
    }
}