В тази статия ще научите за претоварването на оператора (дефинирайте как операторът работи за дефинирани от потребителя типове като обекти) с помощта на примери.
Когато използвате оператор в Kotlin, се извиква функцията на съответния член. Например изразът се a+b
превръща в a.plus(b)
под капака.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
Когато стартирате програмата, изходът ще бъде:
15
Всъщност plus()
функцията е претоварена, за да работи с различни основни типове Kotlin и String
.
// + оператор за основни типове оператор fun plus (друго: Байт): Int оператор fun plus (друго: Кратко): Int оператор fun plus (друго: Int): Int оператор fun plus (друго: Long): Long operator fun plus (друго: Float): Float оператор забавно плюс (друго: Double): Double // за оператор за конкатенация на низове fun String? .plus (друго: Any?): String
Можете също така да определите как операторът работи за обекти, като претовари съответната му функция. Например трябва да дефинирате как +
операторът работи за обекти чрез plus()
функция за претоварване .
Пример: Претоварване + Оператор
fun main(args: Array) ( 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) ) )
Когато стартирате програмата, изходът ще бъде:
сума = (5, 1)
Тук plus()
функцията е маркирана с operator
ключова дума, за да каже на компилатора, че +
операторът е претоварен.
Изразът p1 + p2
се трансформира в p1.plus(p2)
под капака.
Пример: - Претоварване на оператора
В този пример ще се научите да претоварвате --
оператора. Изразът --a
се трансформира в a.dec()
под капака.
Функцията dec()
член не приема никакви аргументи.
fun main(args: Array) ( 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) )
Когато стартирате програмата, изходът ще бъде:
точка = (2, -9)
Не забравяйте, че,
оператор забавно dec () = точка (- x, --y)
е еквивалентно на
оператор забавно dec (): Точка (точка на връщане (- x, --y))
Малко важни точки
1. Когато претоварвате операторите, трябва да се опитате да запазите оригиналния дух на оператора. Например,
fun main(args: Array) ( 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. За разлика от езици като Scala, само определен набор от оператори може да бъде претоварен в Kotlin. Посетете страницата, за да научите за операторите, които могат да бъдат претоварени в Kotlin и съответните им функции за членове.