![](/img/trans.png)
[英]What is KTX (Kotlin Extension Library), Why it is gaining popularity in android development
[英]Android KTX: how to override Kotlin added property extension
我正在嘗試覆蓋 Kotlin 中的 View.setRotation() 方法。
由於 AndroidKTX 已經提供了屬性擴展“旋轉”,調用者可以簡單地調用
viewObject.rotation = 90.0f
旋轉視圖。
但是,我想在用戶更改旋轉時添加一些額外的操作,比如
override fun setRotation(newRotation: Float) {
if (rotation == newRotation)
return
rotation = newRotation
doSomethingElse()
}
由於 StackOverflow 錯誤,這將崩潰。
所以,我必須添加一些額外的代碼來實現這個目標:
private var _rotation: Float = 0.0f
override fun setRotation(newRotation: Float) {
if (_rotation == newRotation) {
return
}
_rotation = newRotation
updateRotationInternally()
}
private fun updateRotationInternally() {
super.setRotation(_rotation)
doSomethingElse()
}
這行得通,但我想知道是否還有其他更優雅的方法,比如“覆蓋屬性擴展設置器”?
我不同意您實施的一個方面:您的return
快捷方式。 您假設使用現有旋轉值調用setRotation()
無效。 如果在 Google 官方版本的View
中確實如此,我不會感到驚訝,但據我們所知,對於運行其修改版 Android 8.0 的某些 Oppo 設備來說,這並不是一個安全的假設。 盡量不要假設不是你寫的東西的行為。 如果您想在新舊旋轉相等時跳過doSomethingElse()
,那很好。
我猜你的setRotation()
函數在View
的某個子類中。 如果是這樣,並考慮到我的上述投訴,這是我能想到的最簡單的方法:
class Bar : View() {
override fun setRotation(f: Float) {
val needSomething = getRotation() != f
super.setRotation(f)
if (needSomething) doSomethingElse()
}
fun doSomethingElse() {
println("got here!")
}
}
我的整體測試代碼是在Kotlin 暫存器(Android 之外)中完成的,所以我使用假的View
實現和假的rotation
擴展屬性進行了測試:
open class View {
private var r: Float = 0.0f
open fun setRotation(f: Float) {
r = f
}
fun getRotation() = r
}
var View.rotation: Float
get() = getRotation()
set(value) = setRotation(value)
class Bar : View() {
override fun setRotation(f: Float) {
val needSomething = getRotation() != f
super.setRotation(f)
if (needSomething) doSomethingElse()
}
fun doSomethingElse() {
println("got here!")
}
}
fun main() {
val bar = Bar()
bar.rotation = 15.0f
bar.rotation = 15.0f
}
如果您在該暫存器中運行此程序,您將在控制台上看到got here
打印一次,這表明雖然我們成功更新了兩次擴展屬性,但我們在第二次調用時跳過了getSomethingElse()
,因為新舊輪換是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.