问题描述
object Deck {
val cardSet = mutableSetof<Card>()
// other useful functions here...
}
现在我可以像这样在 main()
中使用它:
Deck.cardSet.someFunctionSetHas() // e.g. forEach,map,filter,isEmpty...
但是像下面这样使用它会更直观,这正是我想要的:
Deck.isEmpty()
如果我尝试 object Deck: Set<Card> { }
,IDEA 会要求我手动实现一些方法(contains()
、containsAll()
、isEmpty()
、iterator()
)和 {{1} } 成员。我希望 size
Deck
作为 object
变量声明如下:
mutableSet
在这种情况下,我不需要手动实现那些内置方法。这是我想要的 val mset = mutableSetof<Card>()
Deck
行为,以及我自己声明的函数。
解决方法
你可以这样做:
private val cardSet = mutableSetOf<Card>()
object Deck : MutableSet<Card> by cardSet {
// other useful functions here...
}
,
您可以子类化现有的 MutableSet 实现,例如 HashSet:
object Deck: HashSet<Card>() {
// other useful functions here...
}
,
Delegation 可能是最好的方法,如另一个答案中所述。但为了完整起见,可能值得一提的是 java.lang.reflect.Proxy
类,它可用于创建 dynamic proxy;这就是在普通 Java 中完成这些事情的方式,当然 Kotlin/JVM 也可以这样做。