وقتی در زبان کاتلین علمگری مثل + را فرخوانی میکنید در واقع توابع معادل را صدا میزنید. مثلاً وقتی مینویسید 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) }
کد بالا اگرچه به لجاظ تکنیکی مشکلی ندارد ولی استفاده از عملگر + برای تفریق دو پراپرتی برخلاف انتظار بوده و موجب گیج شدن مصرفکننده خواهد شد.
۲- برخلاف زبانهایی همچون اسکالا، تنها تعداد کمی از عملگرها در کاتلین قابل سربارگذاری است. این صفحه را بازدید کنید تا اطلاعات بیشتری راجع سربارگذاری عملگرها به دست آورید.
2 دیدگاه
واقعا مرسی از سایت خوبتون من که خیلی استفاده کردم.
بنده تمام مطالب کاتلین تان را با دقت خواندم و لذت بردم