0

我有一堂课:

  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

有谁知道这是为什么?

4

5 回答 5

7

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

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

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

于 2012-08-07T09:48:13.423 回答
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请为此方法选择不同的名称以避免混淆。

于 2012-08-07T09:48:19.413 回答
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(Product)'。如果打算隐藏,请使用 new 关键字。

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

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

您可能想看到新的修饰符 - msdn

于 2012-08-07T09:48:20.090 回答
0

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

于 2012-08-07T09:48:42.203 回答
0

您需要将 override 隐含声明父方法的替换:

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

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

于 2012-08-07T09:51:37.387 回答