【问题标题】:IEquatable and inheritanceIEquatable 和继承
【发布时间】:2020-08-24 03:05:24
【问题描述】:

我如何让一个父母和一个孩子继承孩子的 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)
    {

    }
}

所以我必须反对,子类别从类别派生,但包含的方法不适用于子类别,但它与类别有关我做错了什么我将如何派生类别的方法,以便包含在子类别为的列表中它的类型会起作用吗?

【问题讨论】:

  • “不适用于子类别”是什么意思?接口和实现都是继承的,所以不清楚是什么问题。
  • 父母永远不会继承孩子所做的任何事情。

标签: c# list contains iequatable


【解决方案1】:

看来您需要在您的SubCategory 上实现IEquatable&lt;SubCategory&gt;。并且SubCategory 定义应更改为public class SubCategory:Category, IEquatable&lt;SubCategory&gt;

没有这个,你将有下一个行为:

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"

这是有道理的,因为SubCategoryIEquatable&lt;Category&gt; 但不是IEquatable&lt;SubCategory&gt;,并且IEnumerable.Contains docs 状态:

使用默认相等比较器 Default 将元素与指定值进行比较。

在你的类中内部使用IEquatable&lt;T&gt;.Equals 的实现。

【讨论】:

    【解决方案2】:

    SubCategory 确实继承了bool Equals(Category other),但它适用于任何 Category实例-这意味着SubCategoryCategory将是如果它们具有相同的Id,则为“相等”。

    听起来您想要IEquatable&lt;SubCategory&gt;bool Equals(SubCategory other) 的“自动”实现,这是不可能的。您需要显式添加接口声明,但实现应该很简单:

    public class SubCategory : Category , IEquatable<SubCategory>  
    {
        public string parentCategory { get; set; }
    
        public SubCategory(string Name, string Id, string HomeCategory, bool inUse) : base(Name, Id, HomeCategory, inUse)
        {
    
        } 
    
        public bool Equals(SubCategory other)
        {
            return ((Category).this).Equals((Category)other)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2020-10-07
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2020-06-19
      相关资源
      最近更新 更多