Υπερφόρτωση χειριστή Kotlin (με παραδείγματα)

Πίνακας περιεχομένων

Σε αυτό το άρθρο, θα μάθετε σχετικά με την υπερφόρτωση του χειριστή (καθορίστε πώς λειτουργεί ο χειριστής για τύπους που ορίζονται από τον χρήστη, όπως αντικείμενα) με τη βοήθεια παραδειγμάτων.

Όταν χρησιμοποιείτε τον τελεστή στο 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.

 // + χειριστής για βασικούς τύπους διασκέδαση χειριστή συν (άλλα: Byte): Διασκέδαση μεταξύ χειριστή συν (άλλα: Σύντομη): Διασκέδαση μεταξύ χειριστή συν (άλλα: Int): Διασκέδαση μεταξύ χειριστή συν (άλλα: Long): Διασκέδαση μεγάλου χειριστή (άλλο: Float): Float operator fun plus (other: Double): Double // for string concatenation operator fun String? .plus (other: 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 () = Point (- x, --y)

είναι ισοδύναμο με

 τελεστής διασκέδαση (): Σημείο (σημείο επιστροφής (- 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 και τις αντίστοιχες λειτουργίες των μελών τους.

ενδιαφέροντα άρθρα...