C # Как вызвать перегруженный оператор в общем родительском классе? - PullRequest
1 голос
/ 13 октября 2019

Следующая проблема: При определении функции универсального родительского класса ParentA я хочу вызвать перегруженный оператор из ChildB:

См. Следующую структуру

class ParentA<T> where T : ParentB
{
    public bool Contains(T element)
    {
             T element2;
         return element==element2;
    }
}

class ChildB : ParentB
{
     public static bool operator ==(ChildB s1, ChildB s2)
     {
      //this one should be used
     }
}


ChildA :ParentA<ChildB>
{
//make use of inherited function Contains(ChildB element)
}

Я хочувызовите перегруженный == оператор ChildB, но вместо этого, когда я вызываю функцию Contains в ChildA, будет вызван оригинальный оператор == из ParentB.

Есть идеи, как заставить это работать?

Оригинальный код немного более неприятный

public abstract class ElementBase
{
    protected Element element;
    public Element Element
    {
        get { return element; }
        set { element = value; }
    }

    public static bool operator ==(ElementBase e1, ElementBase e2)
    {
        return e1.element == e2.element;
    }
    public static bool operator !=(ElementBase e1, ElementBase e2)
    {
        return e1.element != e2.element;
    }
    public override bool Equals(object obj)
    {
        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
            return false;
        else
        {
            ElementBase element = (ElementBase)obj;
            return this == element;
        }
    }
}

public class Structure : ElementBase
{
    public bool flag;
    public static bool operator ==(Structure s1, Structure s2)
    {
        return s1.element == s2.element  && s1.flag==s2.flag;
    }
    public static bool operator !=(Structure s1, Structure s2)
    {
        return s1.element != s2.element || s1.flag!=s2.flag;
    }
    public override bool Equals(object obj)
    {
        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
            return false;
        else
        {
            Structure structure = (Structure)obj;
            return this == structure;
        }
    }
}

public class MapBase<T> where T : ElementBase
{
    protected Dictionary<long, T> elements = new Dictionary<long, T>();
    public bool Contains(T element)
    {
        ...
        return element==elements[id];
    }
}

public class StructureMap : MapBase<Structure>
{
       void someFunction()
       {
            //make use of Contains(Structure element)
       }

}

Обновление

Я заменил

return element==element2;

на

return element.Equals(element2);

и теперь кажется, что он делает свое дело. Я просто не понимаю, почему ...

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