【问题标题】:class inheritance cant get my Equals() to work类继承不能让我的 Equals() 工作
【发布时间】:2012-08-07 09:46:12
【问题描述】:

我有一堂课:

  class Stock : Product
  {
  }

在那个课程中,我创建了一个Equals 方法:

  public bool Equals(Product p)
  {
      return (p.Id == this.Id);
  }

但它不起作用。它告诉我Equals:

警告 1“WindowsFormsApplication1.Stock.Equals(WindowsFormsApplication1.Product)”隐藏了继承的成员“WindowsFormsApplication1.Product.Equals(WindowsFormsApplication1.Product)”。如果要隐藏,请使用 new 关键字。

C:\Users\tom\Desktop\uni\WindowsFormsApplication1\WindowsFormsApplication1\WindowsFormsApplication1\Stock.cs    36  21  WindowsFormsApplication1

有人知道这是为什么吗?

【问题讨论】:

    标签: c# visual-studio


    【解决方案1】:

    您需要重写 Equals 方法,该方法已在 Product Class 中使用。

    public override bool Equals(Product p)
    {
        return (p.Id == this.Id);
    }
    

    或使用new 关键字。但我不认为“新”是你想要的。

    【讨论】:

    • 即使Product 没有使用Equals,它仍然需要override 关键字。用于System.Object
    • 我这样做了,得到了这个错误 1 ​​'WindowsFormsApplication1.Stock.Equals(WindowsFormsApplication1.Product)':不能覆盖继承的成员 'WindowsFormsApplication1.Product.Equals(WindowsFormsApplication1.Product)' 因为它没有被标记虚拟、抽象或覆盖 C:\Users\tom\Desktop\uni\WindowsFormsApplication1\WindowsFormsApplication1\WindowsFormsApplication1\Stock.cs 36 30 WindowsFormsApplication1
    • 覆盖Product.Equals 方法。如果你想覆盖 System.Object.Equals 你应该写: public override bool Equals(Object p) not public override bool Equals(Product p)
    • 或将Product.Equals 方法设为虚拟。这完全取决于您是否要覆盖System.Object.Equals..
    • 如果你将Product.Equals设为虚拟,它隐藏了object.Equals方法,而不是覆盖。 override 关键字已经允许在链中进行更多继承。如果你想停止这个方法的继承链,你可以添加关键字sealed
    【解决方案2】:

    Equals 继承自 System.Object。所有对象都继承这个类。

    public override bool Equals(object p)
    {    
        return ((Stock)p.Id == this.Id);
    }
    

    编辑: 为了覆盖,参数需要是相同的类型。在object 中,它是对象类型。如果你在Product 中声明了这个方法,比如:

    public bool Equals(Product p)
    {    
        return (p.Id == this.Id);
    }
    

    那么您必须将 Stock.Equals 中的参数类型更改为 Product。但是,这个 Equals 方法隐藏了object.Equals,我认为这不是一个好的设计。如果您想正确使用 Equals 方法,则需要重写,因为许多组件在集合中搜索时都会调用此方法,并且无论如何它们都会调用 object.Equals,并且如果您使用隐藏而不是重写,则不会使用您的代码. 如果这些方法是您项目的内部方法并且与object.Equals 机制无关,请为此方法选择不同的名称以避免混淆。

    【讨论】:

    • 同意你对isn't a good design的看法。里希特写了这篇文章。
    【解决方案3】:

    您似乎已经在Product 上定义了一个bool Equals(Product) 方法,将其设为虚拟并在Stock 中覆盖它。

    【讨论】:

    • Product 类中没有必要将Equals 定义为virtualObject 类已经做到了。
    • Object 中的 Equals 方法是针对 Object 参数的,所以它是必要的,除非我们覆盖 bool Equals(Object),否则我们不会
    【解决方案4】:

    你需要把 override 隐含声明父方法的替换:

    public override bool Equals(Product p)     
    {          
       return (p.Id == this.Id);      
    } 
    

    此警告有助于编码人员避免不必要的父方法覆盖。

    【讨论】:

      【解决方案5】:

      这只是一个警告,它将按预期工作。由于您的产品类定义了Equals,因此子类Stock 定义了自己的Equals 方法。

      假设您有以下课程设置:

      class Product
      {
          public bool Equals(Product p)
          {
              return true;
          }
      }
      

        class Stock : Product
          {
              public bool Equals(Product p)
              {
                  return true;
              }
          }
      

      在这里你会得到警告:

      Stock.Equals(Product)' 隐藏继承的成员 '产品.等于(产品)'。如果要隐藏,请使用 new 关键字。

      您可以简单地使用new 关键字告诉编译器“是”是有意隐藏的。 所以你在股票class 中的方法是:

      new public bool Equals(Product p)
      {
          return true;
      }
      

      你可能想看看new modifier - msdn

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 2016-05-17
        • 2015-10-17
        • 2022-06-14
        相关资源
        最近更新 更多