[英]c# Class inheritence, which ID is this setting?
/// <summary>
/// Holds data associated with a label
/// </summary>
public class ArtworkDataLabel : ArtworkLabel
{
public string Data { get; set; }
public int ID { get; set; }
public ArtworkDataLabel()
{
this.ID = 5;
}
}
/// <summary>
/// A template label
/// </summary>
public class ArtworkLabel
{
public int ID { get; set; }
snip
}
这使我感到困惑,为什么编译器允许这样做,并且设置了哪个ID? 如何区分ID? 我应该将其中一个ID重命名吗?
您正在隐式使用new运算符将属性隐藏在基类中:
public new int ID { get; set; }
覆盖方法。
它隐藏了基类的成员并设置了子类的ID。
您可能会发现,如果您构建它时发出警告,则表明您有一个成员“隐藏”或“阴影”另一个成员,但是我认为(至少默认情况下)它不会标记为硬编译器错误。
要启用这种情况,以免引起混淆,您应该将基类中的ID属性标记为“虚拟”,而在子类中将其“覆盖”它:
public class ArtworkDataLabel : ArtworkLabel
{
public string Data { get; set; }
public override int ID { get; set; }
public ArtworkDataLabel()
{
this.ID = 5;
}
}
public class ArtworkLabel
{
public virtual int ID { get; set; }
}
这里所发生的是, ID
中声明ArtworkDataLabel
隐藏了ID
中声明ArtworkLabel
。 如果检查Visual Studio,您会看到这会生成警告 。 如果要隐藏该属性,则可以按如下方式使用new
关键字:
public new int ID {get;set;}
这是一篇文章 ,详细介绍了此功能。
希望这可以帮助 :)
ArtwordDataLabel.ID隐藏了ArtworkLabel.ID,您应该看到一个编译器警告您这正在发生,并且您应该使用“ new”表示这是故意的。 通过将属性改回传统属性并包括一些跟踪日志记录,很容易观察到行为。
我认为,这里更大的问题是继承是否是这些类的正确结构。 根据您要对这些类进行的操作,您可能会发现使用装饰器模式或将它们完全分开更为合适。
是的,您应该重命名它们或使用'new' 修饰符 。 您获得的ID始终是继承类中的ID,而不是父类的ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.