Kotlin dễ ẹc - Lớp vs đối tượng: Lớp nested và inner
Cảnh báo Spam: Bài đăng này chưa sẵn sàng để xuất bản. Tác giả có thể đã vô tình công khai nó trong quá trình viết. Do đó, bạn nên suy nghĩ trước khi đọc bài bài này.
Lớp nested
-
Một lớp có thể lồng vào lớp khác:
class Outer { private val bar: Int = 1 class Nested { fun foo() = 2 } } val demo = Outer.Nested().foo() // == 2 -
Không thể truy cập biến thành viên của lớp Outer
fun foo() = bar // sẽ báo lỗi -
Có thể dùng
interfacecùng với lớp nested. Có thể lồnginterfacetrong lớp, lớp tronginterface,interfacetronginterface.interface OuterInterface { class InnerClass interface InnerInterface } class OuterClass { class InnerClass interface InnerInterface }
Lớp inner
- Một lớp nested được đánh dấu là lớp inner có thể truy cập vào thành phần của lớp outer của lớp đó. Và lớp này chứa tham chiếu đến một đối tượng của một lớp outer.
class Outer { private val bar: Int = 1 inner class Inner { fun foo() = bar } } val demo = Outer().Inner().foo() // == 1 - Lớp inner không cho phép
interface.class Outer { private val bar: Int = 1 inner class Inner { fun foo() = bar interface InnerInterface } }
Khi biên dịch sẽ gây lỗi Interface is not allowed here
So sánh nhẹ cái nhỉ
-
Giống nhao: đều được khai báo bên trong lớp outer.
Lớp nested lớp inner Dùng từ khóa classnhư khai báo lớp bình thườngThêm từ khóa innertrướcclassCho phép khai báo interfacetrong lớp nestedKhông cho phép interfacetrong lớp innerKhông truy cập được biến thành viên của lớp outer Truy cập được biến thành viên của lớp outer Gọi lớp nested Outer.Nested()Gọi lớp inner Outer().Inner()
Lớp inner ẩn danh
- Instance của lớp inner ẩn danh được tạo bằng object expression
window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { ... } override fun mouseEntered(e: MouseEvent) { ... } })
All rights reserved