【问题标题】:c# Class inheritence, which ID is this setting?c#类继承,这个设置是哪个ID?
【发布时间】:2011-03-22 17:00:09
【问题描述】:
/// <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 重命名为其他名称吗?

【问题讨论】:

  • 您真的需要both ID吗?如果是这样,它们不是不同的东西吗?有什么不同?这可能有助于选择更好的名称。如果它们相同,则只需要一个。
  • 我发现总是打开“将警告视为错误”标志进行编译很有用;我相信这会阻止你做这样的事情 =)

标签: c# class inheritance class-design


【解决方案1】:

您将属性隐藏在基类中,隐式使用 new 运算符:

public new int ID { get; set; }

覆盖方法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        public new int ID {get;set;}
        

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

        希望这会有所帮助:)

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2019-05-08
              • 2017-11-25
              • 1970-01-01
              • 1970-01-01
              • 2016-09-02
              • 1970-01-01
              • 1970-01-01
              • 2023-04-06
              • 1970-01-01
              相关资源
              最近更新 更多