Kotlin の演算子オーバーロード

Kotlin では +- などの演算子をオーバーロードできる。例えば、a + b は Kotlin コンパイラによって a.plus(b) に置換されて実行される。つまり a + b を実現するためには aplus() メソッドを実装すればよい。どのメソッドがどの演算子に置換されるかについては、公式ドキュメントを参照されたい。

演算子オーバーロードの機能を例示するため、 plus() の実装例を次に示そう。

演算子を定義するときは operator キーワードを fun の前に置く。 plus() の実装そのものは、単にプロパティの値を加算するだけのもので、特に何の説明も必要な無いだろう。

実に簡単だ。

演算子オーバーロードの「オーバーライド」

演算子オーバーロードに関する Kotlin Koans の問題が秀逸であったので、紹介したい。

端的に言えば、次のようなクラス定義があるときに date + YEAR * 2 + WEEK * 3 + DAY * 15 のような演算を実現したい、というものだ (このとき dateMyDate 型のオブジェクト)。

data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int)
enum class TimeInterval { DAY, WEEK, YEAR }

模範解答にコメントを追記して、実行可能な状態にしたのが次のコードだ。

TimeInterval* (times) を演算子オーバーロードして、その結果を RepeatedTimeInterval とすることと、 MyDate.plus をオーバーロードして引数が TimeIntervalRepeatedTimeInterval のときで処理を分岐させることは、なかなか自分にはできない発想だなあ、と感じた。

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中