English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin 运算子オーバーロード

この記事では、例を通じて運算子オーバーロードについて学びます(運算子がユーザー定義のタイプ(オブジェクト)でどのように動作するかの定義)。

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では特定の演算子グループのみをオーバーロードできます。