类继承无法使我的Equals()工作

本文关键字:Equals 工作 我的 继承 | 更新日期: 2024-10-24 05:30:20

我有一个类:

  class Stock : Product
  {
  }

在这个类中,我制作了一个Equals方法:

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

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

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

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

有人知道为什么会这样吗?

类继承无法使我的Equals()工作

您需要覆盖已在Product class中使用的Equals方法。

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

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

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

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

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

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

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

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

您需要放置override来隐含声明父方法的替换:

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

此警告有助于编码器避免对父方法进行不必要的覆盖。

这只是一个警告,它将按预期工作。由于产品类定义了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)'隐藏继承的成员"Product.Equals(Product)"。如果要隐藏,请使用新关键字。

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

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

您可能想要看到新的修改器-msdn