У овом чланку ћете научити о преоптерећењу оператора (дефинишите како оператор ради за кориснички дефинисане типове попут објеката) помоћу примера.
Када користите оператор у Котлину, позива се функција одговарајућег члана. На пример, израз се a+b
претвара у a.plus(b)
испод хаубе.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
Када покренете програм, излаз ће бити:
15
У ствари, plus()
функција је преоптерећена за рад са разним основним типовима Котлина и 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)
Запамтите да,
оператор фун дец () = Тачка (- к, --и)
је еквивалентно са
дец забаве оператора (): Тачка (повратна тачка (- к, --и))
Неколико важних тачака
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. За разлику од језика попут Сцале, само се одређени скуп оператора може преоптеретити у Котлину. Посетите страницу да бисте сазнали више о операторима који могу бити преоптерећени у Котлину и њиховим одговарајућим функцијама чланова.