【问题标题】:In Kotlin, how to create a single object that has all the features that another class/interface has?在 Kotlin 中,如何创建具有另一个类/接口所具有的所有功能的单个对象?
【发布时间】:2021-03-17 09:47:24
【问题描述】:

我有一个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&lt;Card&gt; { },IDEA 会要求我手动实现一些方法(contains()containsAll()isEmpty()iterator())和size 成员。我希望 Deck object 作为 mutableSet 变量声明如下:

val mset = mutableSetOf<Card>()

在这种情况下,我不需要手动实现那些内置方法。这是我想要的 Deck object 的行为,以及我自己声明的函数。

【问题讨论】:

    标签: object kotlin inheritance set member


    【解决方案1】:

    你可以这样做:

    private val cardSet = mutableSetOf<Card>()
    object Deck : MutableSet<Card> by cardSet {
        // other useful functions here...
    }
    

    【讨论】:

    • 可能值得添加指向language docs on delegation 的链接。
    • 此代码是否可以在不声明 cardSet 变量本身的情况下工作?像这样:object Deck : MutableSet&lt;Card&gt; by mutableSetOf() { // functions... }
    【解决方案2】:

    您可以继承现有的 MutableSet 实现,例如 HashSet:

    object Deck: HashSet<Card>() {
        // other useful functions here...
    }
    

    【讨论】:

      【解决方案3】:

      Delegation 可能是最好的方法,正如另一个答案中给出的那样。但为了完整起见,可能值得一提的是java.lang.reflect.Proxy 类,它可用于创建dynamic proxy;这就是在普通 Java 中完成这些事情的方式,当然 Kotlin/JVM 也可以这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多