类继承不能让我的Equals()工作

1ft*_*tw1 0 c# visual-studio

我有一节课:

  class Stock : Product
  {
  }
Run Code Online (Sandbox Code Playgroud)

在那堂课中,我做了一个Equals方法:

  public bool Equals(Product p)
  {
      return (p.Id == this.Id);
  }
Run Code Online (Sandbox Code Playgroud)

但它不起作用.它告诉我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
Run Code Online (Sandbox Code Playgroud)

有谁知道这是为什么?

Che*_*ene 7

您需要覆盖Equals已在Product Class中使用的方法.

public override bool Equals(Product p)
{
    return (p.Id == this.Id);
}
Run Code Online (Sandbox Code Playgroud)

或者使用new关键字.但我不认为'新'是你想要的.


Ami*_*ach 5

Equals继承自System.Object.所有对象都继承此类.

public override bool Equals(object p)
{    
    return ((Stock)p.Id == this.Id);
}
Run Code Online (Sandbox Code Playgroud)

编辑:为了覆盖,参数需要是相同的类型.在object它是类型的对象.如果您将此方法声明为Product:

public bool Equals(Product p)
{    
    return (p.Id == this.Id);
}
Run Code Online (Sandbox Code Playgroud)

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