我试图创建一个接口,以强制其派生类具有特定属性,但只能使用公共获取程序。由于我不想在其私有范围之外进行更改,因此我不希望它实现公共集。
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*/
}
答案 0 :(得分:4)
属性是某些数据的访问器。您将拥有一个吸气剂,并且如果该属性是可变的,那么它也会是一个setter。因此,您可以使用val
属性覆盖任何已声明的var
属性:
interface Transaction {
val transferDate: Date
}
class MoneyTransaction: Transaction {
override lateinit var transferDate: Date
private set
}
请注意,如果使用对象初始化属性,则无需将属性设为lateinit var
;我只是添加了它,以使您的示例正确编译。
答案 1 :(得分:0)
除了@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
}