我有一节课:
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)
有谁知道这是为什么?
您需要覆盖Equals已在Product Class中使用的方法.
public override bool Equals(Product p)
{
return (p.Id == this.Id);
}
Run Code Online (Sandbox Code Playgroud)
或者使用new关键字.但我不认为'新'是你想要的.
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机制无关,请为此方法选择其他名称以避免混淆.
| 归档时间: |
|
| 查看次数: |
981 次 |
| 最近记录: |