Let’s say I have a parent class and child class as below
Parent Class:
class Parent
{
public string _First;
public string _Last;
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null))
return false;
else if (ReferenceEquals(obj, this))
return true;
else if (obj is Parent == false)
return false;
else
return this.Equals(obj as Parent) & base.Equals(obj);
}
public override int GetHashCode()
{
unchecked
{
return this._First.GetHashCode() ^ this._Last.GetHashCode() ^ base.GetHashCode();
}
}
public bool Equals(Parent that)
{
if (ReferenceEquals(that, null))
return false;
else if (ReferenceEquals(that, this))
return true;
else
return this._First.Equals(that._First) & this._Last.Equals(that._Last);
}
public static bool operator ==(Parent p1, Parent p2)
{
return p1.Equals(p2);
}
public static bool operator !=(Parent p1, Parent p2)
{
return !p1.Equals(p2);
}
}
Child Class:
class Child : Parent
{
public string Address;
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null))
return false;
else if (ReferenceEquals(obj, this))
return true;
else if (obj is Parent == false)
return false;
else
return this.Equals(obj as Child);
}
public override int GetHashCode()
{
unchecked
{
return this._First.GetHashCode() ^ this._Last.GetHashCode() ^ base.GetHashCode();
}
}
public bool Equals(Child that)
{
if (ReferenceEquals(that, null))
return false;
else if (ReferenceEquals(that, this))
return true;
else
return this.Address.Equals(that.Address) & base.Equals(that);
}
public static bool operator ==(Child p1,Child p2)
{
return p1.Equals(p2);
}
public static bool operator !=(Child p1, Child p2)
{
return !p1.Equals(p2);
}
}
And here is the code to compare two instances of child.
Parent p = new Child() { _First = "Mitul", _Last = "Patel", Address="abc1"};
Parent p1 = new Child() { _First = "Mitul", _Last = "Patel", Address = "abc" };
Child c = new Child() { _First = "Mitul", _Last = "Patel", Address = "abc1" };
Child c1 = new Child() { _First = "Mitul", _Last = "Patel", Address = "abc" };
Console.WriteLine(p.Equals(p1));
Console.WriteLine(p == p1);
Console.WriteLine(c.Equals(c1));
Console.WriteLine(c == c1);
Console.Read();
Output
True True False False
I know why it gives true and true during first comparison. Because it calls the overloaded ==() operator of parent class. My question is I wanted to use == operator of child class because the object is of type Child so how can it be possible? For static methods virtual keyword can not be used.
Thanks,
The implementation of the operator is chosen at compile time. Operators are not virtual methods- the child class’s
==operator does not override the parent class==operator.Therefore the only way to make the compiler select the child
==operator is to have the variables themselves be of typeChild, e.g.or to have the
==operator call the Equals method, and make the Child implementation of Equals override the parent implementation:in Parent.cs:
in Child.cs: