Quá tải toán tử Kotlin (Với các ví dụ)

Mục lục

Trong bài viết này, bạn sẽ tìm hiểu về nạp chồng toán tử (xác định cách toán tử hoạt động cho các kiểu do người dùng xác định như đối tượng) với sự trợ giúp của các ví dụ.

Khi bạn sử dụng toán tử trong Kotlin, hàm thành viên tương ứng của nó sẽ được gọi. Ví dụ: a+bchuyển đổi biểu thức thành a.plus(b)under the hood.

 fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )

Khi bạn chạy chương trình, đầu ra sẽ là:

 15

Trên thực tế, plus()chức năng bị quá tải để hoạt động với nhiều loại Kotlin cơ bản khác nhau và String.

 // + toán tử cho các kiểu cơ bản toán tử fun plus (khác: Byte): Toán tử int fun plus (khác: Ngắn): Toán tử int fun plus (other: Int): Toán tử int fun plus (other: Long): Toán tử dài fun plus (other: Float): Float operator fun plus (other: Double): Double // cho toán tử nối chuỗi fun String? .plus (other: Bất kỳ?): String 

Bạn cũng có thể xác định cách toán tử hoạt động cho các đối tượng bằng cách nạp chồng cho hàm tương ứng của nó. Ví dụ: bạn cần xác định cách +toán tử hoạt động cho các đối tượng bằng cách nạp chồng plus()hàm.

Ví dụ: Quá tải + Toán tử

 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) ) )

Khi bạn chạy chương trình, đầu ra sẽ là:

 sum = (5, 1)

Ở đây, plus()hàm được đánh dấu bằng operatortừ khóa để cho trình biên dịch biết rằng +toán tử đang được nạp chồng.

Biểu thức p1 + p2được chuyển thành p1.plus(p2)under the hood.

Ví dụ: - Quá tải toán tử

Trong ví dụ này, bạn sẽ học cách nạp chồng --toán tử. Biểu thức --ađược chuyển thành a.dec()under the hood.

Hàm dec()thành viên không nhận bất kỳ đối số nào.

 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) )

Khi bạn chạy chương trình, phần mở rộng sẽ là:

 điểm = (2, -9) 

Nhớ lấy,

 toán tử vui dec () = Point (- x, --y)

tương đương với

 toán tử fun dec (): Point (return Point (- x, --y))

Vài điểm quan trọng

1. Khi bạn quá tải các nhà khai thác, bạn nên cố gắng duy trì tinh thần ban đầu của nhà điều hành. Ví dụ,

 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) )

Mặc dù chương trình trên đúng về mặt kỹ thuật, nhưng chúng ta đã sử dụng +toán tử để trừ các thuộc tính tương ứng của hai đối tượng khiến chương trình khó hiểu.

2. Không giống như các ngôn ngữ như Scala, chỉ một tập hợp toán tử cụ thể mới có thể được nạp chồng trong Kotlin. Truy cập trang để tìm hiểu về các toán tử có thể bị quá tải trong Kotlin và các hàm thành viên tương ứng của chúng.

thú vị bài viết...