using System;
class Point: Object {
protected int x, y;
public Point() {
this.x = 0;
this.y = 0;
}
public Point(int X, int Y) {
this.x = X;
this.y = Y;
}
public override bool Equals(Object obj) {
if (obj == null || GetType() != obj.GetType()) return false;
Point p = (Point)obj;
return (x == p.x) && (y == p.y);
}
public override int GetHashCode() {
return x ^ y;
}
}
class Point3D: Point {
int z;
public Point3D(int X, int Y, int Z) {
this.x = X;
this.y = Y;
this.z = Z;
}
public override bool Equals(Object obj) {
return base.Equals(obj) && z == ((Point3D)obj).z;
}
public override int GetHashCode() {
return base.GetHashCode() ^ z;
}
}
class MyClass {
public static void Main() {
Point point2D = new Point(5, 5);
Point3D point3Da = new Point3D(5, 5, 2);
Point3D point3Db = new Point3D(5, 5, 2);
if (!point2D.Equals(point3Da)) {
Console.WriteLine("point2D does not equal point3Da.");
}
if (!point3Db.Equals(point2D)) {
Console.WriteLine("Likewise, point3Db does not equal point2D.");
}
if (point3Da.Equals(point3Db)) {
Console.WriteLine("However, point3Da equals point3Db.");
}
}
}