Kotlin - Ủy quyền
Kotlin hỗ trợ “delegation” thiết kế mẫu bằng cách giới thiệu một từ khóa mới “by”. Sử dụng từ khóa hoặc phương pháp ủy quyền này, Kotlin cho phép lớp dẫn xuất truy cập vào tất cả các phương thức công khai được triển khai của một giao diện thông qua một đối tượng cụ thể. Ví dụ sau minh họa cách điều này xảy ra trong Kotlin.
interface Base {
fun printMe() //abstract method
}
class BaseImpl(val x: Int) : Base {
override fun printMe() { println(x) } //implementation of the method
}
class Derived(b: Base) : Base by b // delegating the public method on the object b
fun main(args: Array<String>) {
val b = BaseImpl(10)
Derived(b).printMe() // prints 10 :: accessing the printMe() method
}
Trong ví dụ, chúng ta có một giao diện “Base” với phương thức trừu tượng của nó có tên là “printme ()”. Trong lớp BaseImpl, chúng tôi đang triển khai “printme ()” này và sau đó từ một lớp khác, chúng tôi đang sử dụng triển khai này bằng từ khóa “by”.
Đoạn mã trên sẽ mang lại kết quả sau trong trình duyệt.
10
Ủy quyền tài sản
Trong phần trước, chúng ta đã tìm hiểu về mẫu thiết kế ủy quyền sử dụng từ khóa “by”. Trong phần này, chúng ta sẽ tìm hiểu về ủy quyền các thuộc tính bằng cách sử dụng một số phương thức tiêu chuẩn được đề cập trong thư viện Kotlin.
Ủy quyền có nghĩa là chuyển trách nhiệm cho một lớp hoặc phương thức khác. Khi một thuộc tính đã được khai báo ở một số nơi, thì chúng ta nên sử dụng lại chính mã đó để khởi tạo chúng. Trong các ví dụ sau, chúng tôi sẽ sử dụng một số phương pháp ủy quyền tiêu chuẩn do Kotlin cung cấp và một số hàm thư viện tiêu chuẩn trong khi triển khai ủy quyền trong các ví dụ của chúng tôi.
Sử dụng Lazy ()
Lazy là một hàm lambda lấy một thuộc tính làm đầu vào và đổi lại đưa ra một thể hiện của Lazy<T>, trong đó <T> về cơ bản là loại thuộc tính mà nó đang sử dụng. Hãy cùng chúng tôi xem qua phần sau để hiểu cách hoạt động của nó.
val myVar: String by lazy {
"Hello"
}
fun main(args: Array<String>) {
println(myVar +" My dear friend")
}
Trong đoạn mã trên, chúng ta đang chuyển một biến “myVar” cho hàm Lazy, đổi lại sẽ gán giá trị cho đối tượng của nó và trả về giá trị tương tự cho hàm chính. Sau đây là kết quả trong trình duyệt.
Hello My dear friend
Delegetion.Observable ()
Observable () nhận hai đối số để khởi tạo đối tượng và trả về cùng một hàm được gọi. Trong ví dụ sau, chúng ta sẽ thấy cách sử dụng phương thức Observable () để thực hiện ủy quyền.
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("Welcome to Tutorialspoint.com") {
prop, old, new ->
println("$old -> $new")
}
}
fun main(args: Array<String>) {
val user = User()
user.name = "first"
user.name = "second"
}
Đoạn mã trên sẽ mang lại kết quả sau trong trình duyệt.
first -> second
Nói chung, cú pháp là biểu thức sau khi từ khóa “by” được ủy quyền. Cácget() và set() phương thức của biến p sẽ được ủy quyền cho nó getValue() và setValue() các phương thức được định nghĩa trong lớp Delegate.
class Example {
var p: String by Delegate()
}
Đối với đoạn mã trên, sau đây là lớp đại biểu mà chúng ta cần tạo để gán giá trị trong biến p.
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, thank you for delegating '${property.name}' to me!"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$value has been assigned to '${property.name} in $thisRef.'")
}
}
Trong khi đọc, phương thức getValue () sẽ được gọi và trong khi thiết lập phương thức setValue () biến sẽ được gọi.