我有一个班级:
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
任何人都知道这是为什么?
答案 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);
}
此警告有助于编码人员避免不必要的父方法覆盖。