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

时间:2012-08-07 09:46:12

标签: c# visual-studio

我有一个班级:

  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

任何人都知道这是为什么?

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:5)

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机制无关,请为此方法选择其他名称以避免混淆。

答案 2 :(得分:0)

这只是一个警告,它将按预期工作。由于您的产品类定义了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(产品)'。如果想要隐藏,请使用new关键字。

您可以简单地使用new关键字告诉编译器是隐藏的意图。 因此,库存class内的方法将是:

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

您可能希望看到new modifier - msdn

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您需要将override置于隐式声明父方法的替换:

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

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