繁体   English   中英

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

[英]Accessing properties of the base class in a double derived class

我在双重派生类中访问基类的属性时遇到麻烦。 我在下面提供了一个简单的问题示例。

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

我知道基类的Status属性肯定会设置为一个值,但是如果我在ColoredLight类中调用GetStatus方法,它将返回null。

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

先谢谢您的帮助。

编辑:[已解决]我遇到的问题是由于愚蠢和我自己的疏忽所致,因为我在Device和Light类中都声明了Status属性。 但是,以下解决方案使我对C#中“受保护”,“虚拟”和“替代”的用法有了更深入的了解,因此我将原样保留该问题,以便它可能对其他人也有帮助!

完全摆脱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;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM