我无法在双派生类中访问基类的属性。我在下面列出了一个简单的问题示例。
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#中“受保护”,“虚拟”和“覆盖”的使用的理解,所以我将保留问题,所以它也可以帮助其他人!
答案 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;
}
}
}