V tomto článku sa pomocou príkladov dozviete o preťažení operátora (definujte, ako operátor pracuje pre typy definované používateľom, ako sú objekty).
Keď v Kotline použijete operátor, volá sa jeho príslušná členská funkcia. Napríklad výraz sa a+b
transformuje na a.plus(b)
pod kapotou.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
Po spustení programu bude výstup:
15
V skutočnosti je plus()
funkcia preťažená pri práci s rôznymi základnými typmi Kotlin a String
.
// + operátor pre základné typy 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
Môžete tiež definovať, ako operátor pracuje pre objekty, preťažením príslušnej funkcie. Napríklad musíte definovať, ako +
operátor pracuje pre objekty preťažením plus()
.
Príklad: preťaženie + operátor
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) ) )
Po spustení programu bude výstup:
suma = (5, 1)
Tu je plus()
funkcia označená operator
kľúčovým slovom, ktoré informuje kompilátor o +
preťažení operátora.
Výraz p1 + p2
sa transformuje na p1.plus(p2)
pod kapotou.
Príklad: - Preťaženie operátora
V tomto príklade sa naučíte preťažovať --
operátora. Výraz --a
sa transformuje na a.dec()
pod kapotou.
dec()
Členské funkcia nemá žiadne argumenty.
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) )
Keď spustíte program, výstup bude:
bod = (2, -9)
Zapamätaj si to,
operator fun dec () = Bod (- x, --y)
je ekvivalentné k
operator fun dec (): Point (return Point (- x, --y))
Niekoľko dôležitých bodov
1. Pri preťažení obsluhy by ste sa mali pokúsiť zachovať pôvodného ducha obsluhy. Napríklad,
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) )
Aj keď je vyššie uvedený program technicky správny, +
na odčítanie zodpovedajúcich vlastností dvoch objektov sme použili operátor, ktorý spôsobil, že program bol zmätený.
2. Na rozdiel od jazykov, ako je Scala, v Kotline môže byť preťažená iba konkrétna skupina operátorov. Navštívte stránku a dozviete sa viac o operátoroch, ktorí môžu byť v Kotline preťažení, a o ich príslušných členských funkciách.