こんにちは。阿部です。

オーバーロードとは

オーバーロードとは、あるクラスに同じ名前で引数の異なるメソッドを定義することです。

メソッド使用時には、引数の型に応じて、それぞれ異なる処理が実行されます。

戻り値が異なるだけではオーバーロードできない

一方、引数の型が同じで戻り値の型だけが異なる場合は、ビルドエラーとなります。

型引数による分岐

どうしても、同じ引数で戻り値の型を分けたい場合は、型引数(<T>)を使用することで対処可能です。

呼び出し側はこうなります。

型引数を付けるのが面倒ですね。これなら、関数名をMyFunctionIntMyFunctionStringなどとしてしまった方が良さそうです。

戻り値の型によるオーバーロードの実現

さて、ここからが本題です。型引数も無くしてしまって、次のような関数を作りましょう。

これを実現するためには、まず、関数自体は次のように作ります。

戻り値はintでもstringでもなく、この関数専用の型(MyFunctionResult)にします。そして、MyFunctionResultnewして返すだけの処理とします。

さて、仕掛けは、このMyFunctionResult型の方にあります。次のように作ります。

ポイントは、型変換演算子(public static implicit operator 型名)です。このような演算子を定義しておくと、MyFunctionResult型オブジェクトを他の型に変換することができます。

また、implicitとは、「暗黙的」という意味で、これを指定しておけば、明示的にキャストしなくても必要に応じてMyFunctionResult型から他の型への変換が行われるようになります。

図解

普通のオーバーロードだと、引数の型や個数が異なっている場合に、それぞれ異なる処理を行うことができます。

本手法だと、同じ型の引数に対して異なる処理を実行することができます。

使用法

代入先の型によって処理が分岐します。

戻り値を、他の関数の引数に直接渡すような場合でも、型によって処理が分岐します。

型変換を定義していない型に代入しようとすると、ビルドエラーとなります。

 
TOP
TOP