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 が出力される
}
};
このサイトのページへのリンクは自由に行っていただいてかまいません。
このサイトで公開している全ての画像、プログラム、文書の無断転載を禁止します。
ここをクリック
すると表示されるページから作者へメールで連絡できます。