c# - IEquatable 和继承
问题描述
我将如何让一个父母和一个孩子继承孩子的 IEquatable 功能?这是我的代码
public class Category : IEquatable<Category>
{
public string _Name { get; set; }
public string _Id { get; set;}
private string _HomeCategory { get; set; }
public string _prestaId { get; set; }
public bool _inUse { get; set; }
public Category(string Name, string Id, string HomeCategory, bool inUse)
{
_Name = Name;
_Id = Id;
_HomeCategory = HomeCategory;
_inUse = inUse;
}
public virtual bool Equals(Category other)
{
if (other == null)
return false;
if(this._Id == other._Id)
{
return true;
}
else { return false; }
}
public override int GetHashCode()
{
return this._Id.GetHashCode();
}
}
public class SubCategory : Category :
{
public string parentCategory { get; set; }
public SubCategory(string Name, string Id, string HomeCategory, bool inUse) : base(Name, Id, HomeCategory, inUse)
{
}
}
所以我必须反对,子类别从类别派生,但包含的方法不适用于子类别,但它与类别有关工作?
解决方案
看来你需要IEquatable<SubCategory>
在你的SubCategory
. 并且SubCategory
定义应该更改为public class SubCategory:Category, IEquatable<SubCategory>
.
没有这个,你将有下一个行为:
var sub = new SubCategory { _Name = "1", parentCategory = "2" };
var x = new List<Category>();
x.Add(sub);
Console.WriteLine(x.Contains(new SubCategory
{
_Name = sub._Name,
parentCategory = sub.parentCategory
})); // prints "True"
var y = new List<SubCategory>();
y.Add(sub);
Console.WriteLine(y.Contains(new SubCategory
{
_Name = sub._Name,
parentCategory = sub.parentCategory
})); // prints "False"
这是有道理的,原因SubCategory
是IEquatable<Category>
但不是IEquatable<SubCategory>
,并且IEnumerable.Contains 文档状态:
使用默认相等比较器 Default 将元素与指定值进行比较。
Which internally uses the implementation of the IEquatable<T>.Equals
in your class.