IEquatable и наследование - PullRequest
0 голосов
/ 08 мая 2020

как мне сделать одного родителя и одного ребенка и унаследовать функцию 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)
    {

    }
}

, поэтому я должен объект, а подкатегория происходит от категории, но метод contain´s не работает с подкатегорией, но работает с категорией, что я делаю неправильно, как бы я мог получить метод Категория, содержащаяся в списке с подкатегорией, поскольку ее тип будет работать?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

SubCategory действительно наследует bool Equals(Category other), но это применимо к любому Category экземпляру - это означает, что SubCategory и Category будут «равны «если у них одинаковые Id.

Похоже, вам нужна «автоматическая c» реализация IEquatable<SubCategory> и 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)
    }
}
0 голосов
/ 08 мая 2020

Похоже, вам нужно реализовать 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. Содержит документы состояние:

Элементы сравниваются с указанным значением с помощью компаратора равенства по умолчанию, Default.

Которая внутренне использует реализацию IEquatable<T>.Equals в вашем классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...