【问题标题】:Kotlin: referring to delegate that is not passed by constructorKotlin:指代不是由构造函数传递的委托
【发布时间】:2022-11-14 02:23:59
【问题描述】:

我想在特定上下文中使用 Kotlin delegation

  • 不应在构造函数中传递委托。
  • 我想保留对委托的引用以供以后在代码中使用。在我覆盖的方法中,比如printMessage(),我仍然需要像在多态继承中调用super.printMessage() 一样调用委托。

我可以通过在by 子句(class Derived() : Base by BaseImpl(42) 使用Kotlin's documentation example)中简单地实例化一个匿名委托来完成第一个。然而, 这使我无法访问匿名委托,因为我不知道可以引用它。

我想做类似于以下的事情。但是,以下内容无法编译并出现错误'this' is not defined in this context

class Derived() : Base by this.b {
    
    val b: Base = BaseImpl(42)
    
    override fun printMessage() {
        b.printMessage()
        print("abc")
    }
}

我的Derived 类的每个实例都需要一个单独的委托。因此,将b 作为全局变量移动对我来说不是一个选择。

我最接近我需要的是构造函数的可选参数。这也不是一个好的选择,因为我不想让我的 Derived 类与任意代表一起构建。

【问题讨论】:

    标签: kotlin delegates delegation kotlin-delegate


    【解决方案1】:

    您可以使用私有主构造函数和公共辅助构造函数来执行此操作:

    class Derived private constructor(val b: Base) : Base by b {
    
        constructor(): this(BaseImpl(42))
    
        override fun printMessage() {
            b.printMessage()
            print("abc")
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果你不需要对委托的引用,你也可以简单地说,

      class Derived : Base by BaseImpl(42)
      

      【讨论】:

        猜你喜欢
        • 2011-06-23
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多