繁体   English   中英

c#类继承,此设置是哪个ID?

[英]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.

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