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
interface
cùng với lớp nested. Có thể lồnginterface
trong lớp, lớp tronginterface
,interface
tronginterface
.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 class
như khai báo lớp bình thườngThêm từ khóa inner
trướcclass
Cho phép khai báo interface
trong lớp nestedKhông cho phép interface
trong 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