English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、例を通じて運算子オーバーロードについて学びます(運算子がユーザー定義のタイプ(オブジェクト)でどのように動作するかの定義)。
Kotlinでoperatorを使用する場合、その対応するメンバーファンクションが呼び出されます。例えば、表現a + bはa.plus(b)としてバックグラウンドで変換されます。
fun main(args: Array<String>) { val a = 5 val b = 10 print(a.plus(b)) // print(a+b) }
プログラムを実行すると、出力は次のようになります:
15
実際には、plus()関数はKotlinの基本データ型とString(文字列)を処理するためにオーバーロードされています。
// + 基本データ型のオペレータ operator fun plus(other: Byte): Int operator fun plus(other: Short): Int operator fun plus(other: Int): Int operator fun plus(other: Long): Long operator fun plus(other: Float): Float operator fun plus(other: Double): Double //文字列結合に使用 operator fun String?.plus(other: Any?): String
オペレータがオブジェクトに対してどのように働くかを定義するために、対応する関数をオーバーロードすることもできます。例えば、plus()関数をオーバーロードして、+オペレータがオブジェクトに対してどのように働くかを示します。
fun main(args: Array<String>) { val p1 = Point(3, -8) val p2 = Point(2, 9) var sum = Point() sum = p1 + p2 println("合計= (${sum.x}, ${sum.y})") } class Point(val x: Int = 0, val y: Int = 10) { //plus関数のオーバーロード operator fun plus(p: Point): Point { return Point(x + p.x, y + p.y) } }
プログラムを実行すると、出力は次のようになります:
sum = (5, 1)
ここでは、plus()関数がoperatorキーワードでマークされており、コンパイラに通知されています。 + オペレータがオーバーロードされています。
表現 p1 + p2 バックグラウンドで p に変換されます。1.plus(p2)。
この例では、オペレータのオーバーロードを学びます。 - オペレータ表現 --a はバックグラウンドで a.dec() に変換されます。
dec()メンバーファンクションは任何の引数を持ちません。
fun main(args: Array<String>) { var point = Point(3, -8) --point println("point = (${point.x}, ${point.y})") } class Point(var x: Int = 0, var y: Int = 10) { operator fun dec() = Point(--x, --y) }
プログラムを実行すると、出力は次のようになります:
point = (2, -9)
思い出してください
operator fun dec() = Point(--x, --y)
それは
operator fun dec(): Point { return Point(--x, --y) }
1、オペレータのオーバーロード時は、オペレータの元の機能を保つことを試みるべきです。例えば、
fun main(args: Array<String>) { val p1 = Point(3, -8) val p2 = Point(2, 9) var sum = Point() sum = p1 + p2 println("合計= (${sum.x}, ${sum.y})") } class Point(val x: Int = 0, val y: Int = 10) { //重载plus関数 operator fun plus(p: Point) = Point(x - p.x, y - p.y) }
上記のプログラムは技術的には正しいですが、私たちは + 演算子は二つのオブジェクトの対応する属性を引き算し、プログラムを混乱させることになります。
2Scalaなどの言語とは異なり、Kotlinでは特定の演算子グループのみをオーバーロードできます。