آموزش زبان کاتلین – درس ۳۰ (سربارگذاری عملگرها)

نویسنده : سید ایوب کوکبی ۳ بهمن ۱۳۹۷

وقتی در زبان کاتلین علمگری مثل + را فرخوانی می‌کنید در واقع توابع معادل را صدا می‌زنید. مثلاً وقتی می‌نویسید a+b، در پشت‌صحنه (a.plus(b فراخوانی می‌شود:

fun main(args: Array<String>) {
    val a = 5
    val b = 10

    print(a.plus(b)) // print(a+b)
}

خروجی:

۱۵

در حقیقت، تابع ()plus سربارگذاری (Overload) شده تا با انواع مختلفی در کاتلین بتوانند از این تابع استفاده کنند.

// + operator for basic types
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

// for string concatenation
operator fun String?.plus(other: Any?): String

در همه زبان‌ها از جمله کاتلین این امکان وجود دارد که عملگر خاصی را سربارگذاری کنید تا به آن صورتی که شما دوست دارید خروجی را تولید کند.

مثالی از سربارگذاری عملگر + در کاتلین

fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)

    var sum = Point()
    sum = p1 + p2

    println("sum = (${sum.x}, ${sum.y})")
}

class Point(val x: Int = 0, val y: Int = 10) {

    // overloading plus function
    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
}

خروجی:

sum = (5, 1)

همانطور که می‌بینید، تابع ()plus را با کلیدواژه operator علامت زده‌ایم تا به کامپایلر بفهمانیم که عملگر + را سربارگذاری کرده‌ایم. اکنون وقتی p1+p2 را صدا می‌زنید در پشت‌صحنه (p1.plus(p2 فراخوانی می‌شود.

مثالی از سربارگذاری عملگر — در کاتلین

حالا بیایید عملگر — که یک عملگر یکانی است را overload کنیم. وقتی a– را فرا می‌خوانید در واقع تابع ()a.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)
}

چند نکته مهم

۱- وقتی عملگری را سربارگذاری می‌کنید، باید تلاش کنید عملکردِ عملگر اصلی را پابرجا نگه دارید:

fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)

    var sum = Point()
    sum = p1 + p2

    println("sum = (${sum.x}, ${sum.y})")
}

class Point(val x: Int = 0, val y: Int = 10) {

    // overloading plus function
    operator fun plus(p: Point) = Point(x - p.x, y - p.y)
}

کد بالا اگرچه به لجاظ تکنیکی مشکلی ندارد ولی استفاده از عملگر + برای تفریق دو پراپرتی برخلاف انتظار بوده و موجب گیج شدن مصرف‌کننده خواهد شد.

بخوانید  آموزش زبان کاتلین – درس 22 (کلاس انتزاعی)

۲- برخلاف زبان‌هایی همچون اسکالا، تنها تعداد کمی از عملگرها در کاتلین قابل سربارگذاری است. این صفحه را بازدید کنید تا اطلاعات بیشتری راجع سربارگذاری عملگرها به دست آورید.

سید ایوب کوکبی

نویسنده و مترجم...

1 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *




    سعیدی

    سه شنبه ۲۰ فروردین ۱۳۹۸

    واقعا مرسی از سایت خوبتون من که خیلی استفاده کردم.