c++ 同様、演算子のオーバライドができます。1例として加算は以下のとおり。
class MyInt { private int value; public MyInt(int value) { this.value = value; } public void Print() { Console.WriteLine(value); } public static MyInt operator+(MyInt a, MyInt b) { return new MyInt(a.value + b.value); } public static void Test() { MyInt a = new MyInt(3); MyInt b = new MyInt(4); MyInt c = a + b; c.Print(); } };
イコール(==)、ノットイコール(!=) のオーバライドは以下の様に行います。 Equals と、GetHashCode もオーバライドしないとコンパイラが文句を言います。
public override bool Equals(Object o) { if (!(o is MyInt)) return false; return this == (MyInt)o; } public override int GetHashCode() { return value; } public static bool operator==(MyInt a, MyInt b) { return a.value == b.value; } public static bool operator!=(MyInt a, MyInt b) { return ! (a.value == b.value); }
キャスト演算子のオーバライドは以下のとおり。
明示的なキャストが必要な場合は explicit、自動的に変換して良い場合は implicit キーワードを使用します。
public static explicit operator MyInt(int value) { return new MyInt(value); } public static implicit operator int(MyInt x) { return x.value; } public static void TestCast() { MyInt b = (MyInt)4; // MyInt b = 4; // コンパイルエラーになる MyInt a = new MyInt(3); int aInt = a; // OK }
インタフェースを複数継承してメソッドの名前と型が衝突している場合に、 2番目以降の実装を明示する必要があります。
interface ICollTestA { void Print(); }; interface ICollTestB { void Print(); }; class CollTest : ICollTestA, ICollTestB { public void Print() { Console.WriteLine("Print"); } void ICollTestB.Print() { Console.WriteLine("PrintB"); } public static void Test() { CollTest a = new CollTest(); a.Print(); // Print が出力される ICollTestB b = a; b.Print(); // PrintB が出力される } };
このサイトのページへのリンクは自由に行っていただいてかまいません。
このサイトで公開している全ての画像、プログラム、文書の無断転載を禁止します。
ここをクリック
すると表示されるページから作者へメールで連絡できます。