【问题标题】:Kotlin Interface Property: Only require public getter without public setterKotlin 接口属性:只需要公共 getter 而没有公共 setter
【发布时间】:2019-05-07 16:34:42
【问题描述】:

我正在尝试创建一个接口,该接口强制其派生类具有特定属性,但只能使用公共 getter。由于我不想允许从其私有范围之外进行更改,因此我不希望它实现公共集。

interface Transaction{
   var transferDate: Date get //I only require a get, no set
}

class MoneyTransaction(){
   override var transferDate: Date get private set 
/*private set does not work*/
}

【问题讨论】:

  • 您可以将属性定义为 val,在您的情况下是否足够?
  • 不,遗憾的是没有,因为我仍然需要能够私下更改派生类中的值。
  • 您可以在实现时将属性设为var
  • 在界面中将其实现为val 是正确的方法。派生类可以有私有的支持 var 字段,并通过接口 getter 公开该值。
  • 所以与其他类的接口只是为了读取值,我会为它定义一个函数,并留给实现它的类来决定如何提供它。

标签: kotlin interface properties scope set


【解决方案1】:

属性是某些数据的访问器。您将有一个 getter,如果该属性是可变的,则还有一个 setter。因此,您可以使用 var 属性覆盖任何已声明的 val 属性:

interface Transaction {
   val transferDate: Date
}

class MoneyTransaction: Transaction {
   override lateinit var transferDate: Date
       private set 
}

请注意,如果使用对象对其进行初始化,则不需要将属性设为lateinit var;我刚刚添加它是为了让您的示例正确编译。

【讨论】:

  • 谢谢兄弟!完美?
【解决方案2】:

除了@tynn 的helpful answer,就我而言,我只需要一个访问器来获取来自其他来源的数据。对于这种情况,假设使用 getter 初始化值,则可以使用 val 代替 lateinit var,并且无需指明 private set

作为与其他人一致的示例:

interface Transaction {
   val transferDate: Date
}

class MostRecentTransaction(private val repo: AccountRepository) : Transaction {
   override val transferDate: Date
      get() = repo.transactions.first.transferDate
}

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2017-04-10
    • 2011-08-21
    相关资源
    最近更新 更多