类继承无法使我的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
有人知道为什么会这样吗?
您需要覆盖已在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