using System;
public class Test
{
class ClassA
{
public string Value1 { get; protected set; }
// コンストラクタ
public ClassA(string val) { Value1 = val; }
// == 演算子を定義
public static bool operator==(ClassA self, ClassA other)
{
return self.Value1 == other.Value1;
}
// == を定義するためには != もペアで定義が必要
public static bool operator!=(ClassA self, ClassA other)
{
return !(self == other);
}
}
// ClassA を継承したクラス
class ClassB : ClassA
{
public int Value2 { get; protected set; }
public ClassB(string val1, int val2) : base(val1) { Value2 = val2; }
// == をオーバーライド?(実は出来ていない)
public static bool operator==(ClassB self, ClassB other)
{
return self.Value1 == other.Value1 && self.Value2 == other.Value2;
}
// == を定義するためには != もペアで定義が必要
public static bool operator!=(ClassB self, ClassB other)
{
return !(self == other);
}
}
static void Main(string[] args)
{
// ClassA のインスタンスを比較
var a1 = new ClassA("A");
var a2 = new ClassA("A");
Console.WriteLine(a1 == a2); // True
// ClassB のインスタンスを比較
var b1 = new ClassB("1", 10);
var b2 = new ClassB("1", 20);
Console.WriteLine(b1 == b2); // False <= Value2 の値が異なるので False
// ClassA 型の変数に代入(キャスト)
ClassA c1 = b1;
ClassA c2 = b2;
Console.WriteLine(c1 == c2); // True <= ここで、ClassAの==演算子が呼ばれている
Console.WriteLine($"{c1.GetType().Name}, {c2.GetType().Name}"); // ClassB, ClassB <= 実体はどちらもClassB
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJY2xhc3MgQ2xhc3NBCgl7CgkgICAgcHVibGljIHN0cmluZyBWYWx1ZTEgeyBnZXQ7IHByb3RlY3RlZCBzZXQ7IH0KCQoJICAgIC8vIOOCs+ODs+OCueODiOODqeOCr+OCvwoJICAgIHB1YmxpYyBDbGFzc0Eoc3RyaW5nIHZhbCkgeyBWYWx1ZTEgPSB2YWw7IH0KCQoJICAgIC8vID09IOa8lOeul+WtkOOCkuWumue+qQoJICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBvcGVyYXRvcj09KENsYXNzQSBzZWxmLCBDbGFzc0Egb3RoZXIpCgkgICAgewoJICAgICAgICByZXR1cm4gc2VsZi5WYWx1ZTEgPT0gb3RoZXIuVmFsdWUxOwoJICAgIH0KCSAgICAvLyA9PSDjgpLlrprnvqnjgZnjgovjgZ/jgoHjgavjga8gIT0g44KC44Oa44Ki44Gn5a6a576p44GM5b+F6KaBCgkgICAgcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yIT0oQ2xhc3NBIHNlbGYsIENsYXNzQSBvdGhlcikKCSAgICB7CgkgICAgICAgIHJldHVybiAhKHNlbGYgPT0gb3RoZXIpOwoJICAgIH0KCX0KCQoJLy8gQ2xhc3NBIOOCkue2meaJv+OBl+OBn+OCr+ODqeOCuQoJY2xhc3MgQ2xhc3NCIDogQ2xhc3NBCgl7CgkgICAgcHVibGljIGludCBWYWx1ZTIgeyBnZXQ7IHByb3RlY3RlZCBzZXQ7IH0KCQoJICAgIHB1YmxpYyBDbGFzc0Ioc3RyaW5nIHZhbDEsIGludCB2YWwyKSA6IGJhc2UodmFsMSkgeyBWYWx1ZTIgPSB2YWwyOyB9CgkKCSAgICAvLyA9PSDjgpLjgqrjg7zjg5Djg7zjg6njgqTjg4nvvJ/vvIjlrp/jga/lh7rmnaXjgabjgYTjgarjgYTvvIkKCSAgICBwdWJsaWMgc3RhdGljIGJvb2wgb3BlcmF0b3I9PShDbGFzc0Igc2VsZiwgQ2xhc3NCIG90aGVyKQoJICAgIHsKCSAgICAgICAgcmV0dXJuIHNlbGYuVmFsdWUxID09IG90aGVyLlZhbHVlMSAmJiBzZWxmLlZhbHVlMiA9PSBvdGhlci5WYWx1ZTI7CgkgICAgfQoJICAgIC8vID09IOOCkuWumue+qeOBmeOCi+OBn+OCgeOBq+OBryAhPSDjgoLjg5rjgqLjgaflrprnvqnjgYzlv4XopoEKCSAgICBwdWJsaWMgc3RhdGljIGJvb2wgb3BlcmF0b3IhPShDbGFzc0Igc2VsZiwgQ2xhc3NCIG90aGVyKQoJICAgIHsKCSAgICAgICAgcmV0dXJuICEoc2VsZiA9PSBvdGhlcik7CgkgICAgfQoJfQoKICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgIHsKICAgICAgICAvLyBDbGFzc0Eg44Gu44Kk44Oz44K544K/44Oz44K544KS5q+U6LyDCiAgICAgICAgdmFyIGExID0gbmV3IENsYXNzQSgiQSIpOwogICAgICAgIHZhciBhMiA9IG5ldyBDbGFzc0EoIkEiKTsKCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoYTEgPT0gYTIpOyAgLy8gVHJ1ZQoKICAgICAgICAvLyBDbGFzc0Ig44Gu44Kk44Oz44K544K/44Oz44K544KS5q+U6LyDCiAgICAgICAgdmFyIGIxID0gbmV3IENsYXNzQigiMSIsIDEwKTsKICAgICAgICB2YXIgYjIgPSBuZXcgQ2xhc3NCKCIxIiwgMjApOwoKICAgICAgICBDb25zb2xlLldyaXRlTGluZShiMSA9PSBiMik7ICAvLyBGYWxzZSAgPD0gVmFsdWUyIOOBruWApOOBjOeVsOOBquOCi+OBruOBpyBGYWxzZQoKICAgICAgICAvLyBDbGFzc0Eg5Z6L44Gu5aSJ5pWw44Gr5Luj5YWl77yI44Kt44Oj44K544OI77yJCiAgICAgICAgQ2xhc3NBIGMxID0gYjE7CiAgICAgICAgQ2xhc3NBIGMyID0gYjI7CgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGMxID09IGMyKTsgIC8vIFRydWUgIDw9IOOBk+OBk+OBp+OAgUNsYXNzQeOBrj095ryU566X5a2Q44GM5ZG844Gw44KM44Gm44GE44KLCgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQie2MxLkdldFR5cGUoKS5OYW1lfSwge2MyLkdldFR5cGUoKS5OYW1lfSIpOyAgLy8gQ2xhc3NCLCBDbGFzc0IgIDw9IOWun+S9k+OBr+OBqeOBoeOCieOCgkNsYXNzQgogICAgfQp9Cg==