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

时间:2011-03-22 17:00:09

标签: c# class inheritance class-design

/// <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重命名为其他内容吗?

6 个答案:

答案 0 :(得分:3)

您正在隐藏使用new运算符的基类中的属性:

public new int ID { get; set; }

这会覆盖该方法。

答案 1 :(得分:2)

它隐藏基类的成员并设置子类的ID。

答案 2 :(得分:1)

你可能会发现,如果你构建它,你有警告,表明你有一个“隐藏”或“阴影”另一个成员,但我不认为(默认情况下,至少)它会标记为硬编译器错误。

要启用此方案以避免混淆,您应该将基类中的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; }
}

答案 3 :(得分:1)

这里发生的事情是ID 中声明的ArtworkDataLabel隐藏 ID中声明的ArtworkLabel。如果您检查visual studio,您会看到这会生成警告。如果您打算隐藏该属性,可以使用new关键字,如下所示:

public new int ID {get;set;}

此处an article更详细地解释了此功能。

希望这会有所帮助:)

答案 4 :(得分:1)

ArtwordDataLabel.ID隐藏了ArtworkLabel.ID,您应该看到编译器警告您发生了这种情况,并且您应该使用“new”来表明这是故意的。通过将属性更改回传统属性并包括一些跟踪日志记录来观察行为非常容易。

我认为这里更大的问题是继承是否是这些类的正确结构。根据您尝试对这些类进行的操作,您可能会发现使用装饰器模式甚至将它们完全分开是更合适的。

答案 5 :(得分:0)

是的,您应该重命名它们或使用“新”modifier。您获得的ID始终是继承类中的ID,而不是父级的ID。