簡體   English   中英

Android KTX:如何覆蓋 Kotlin 添加屬性擴展

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM