在 Kotlin 中,如何创建具有另一个 class/interface 所具有的所有功能的单个对象?
In Kotlin, how to create a single object that has all the features that another class/interface has?
我有一个 Deck
object
有一个 Set
成员:
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()
)和 size
成员。我希望 Deck
object
作为 mutableSet
变量声明如下:
val mset = mutableSetOf<Card>()
在这种情况下,我不需要手动实现这些内置方法。这是我想要 Deck
object
加上我自己声明的函数的行为。
你可以这样做:
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 is probably the best way, as given in another answer. But for completeness, it might be worth mentioning the java.lang.reflect.Proxy
class, which can be used to create a dynamic proxy;这就是普通 Java 中完成这些事情的方式,所以当然 Kotlin/JVM 也可以这样做。
我有一个 Deck
object
有一个 Set
成员:
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()
)和 size
成员。我希望 Deck
object
作为 mutableSet
变量声明如下:
val mset = mutableSetOf<Card>()
在这种情况下,我不需要手动实现这些内置方法。这是我想要 Deck
object
加上我自己声明的函数的行为。
你可以这样做:
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 is probably the best way, as given in another answer. But for completeness, it might be worth mentioning the java.lang.reflect.Proxy
class, which can be used to create a dynamic proxy;这就是普通 Java 中完成这些事情的方式,所以当然 Kotlin/JVM 也可以这样做。