【问题标题】:Access private member in self typed trait - without access scope leaking访问自类型特征中的私有成员 - 没有访问范围泄漏
【发布时间】:2015-12-30 13:33:52
【问题描述】:

让一个类的私有成员在一个具有该类类型的自类型特征中可访问的直接方法是什么?

似乎protected 完成了这项工作,但是 AFAIK 也允许访问子类,这对我来说有点太宽泛的访问范围捆绑了,除非具有自我类型和子类的特征比我想象的更密切相关.你能解释一下吗?

代码小提琴:

trait CakeLayer {
  self: A =>
    println(a)
}

class A {
  protected val a: Int = 3
}

对我来说,自类型特征的语义与子类的语义非常不同,当我将它用于蛋糕模式时:我不希望任何子类具有访问权限,而只有特定的自类型特征.

【问题讨论】:

    标签: scala


    【解决方案1】:

    我可以想出一种有点复杂的执行方式 - 它可能会激励您(或其他人)找到更可行的解决方案:

    trait CakeLayer {
      self: A =>
    
      def funcToRun(a: Int) = println(a)
    
      runFuncOnA
    
    }
    
    class A {
    
      implicit val me: this.type = this
    
      private val a: Int = 3
    
      protected def runFuncOnA(implicit cl: CakeLayer) = cl.funcToRun(a)
    }
    

    这强制任何不扩展 CakeLayer 试图调用 runFuncOnA 的 A 子类将无法编译:

    scala> val aa = new A // Doesn't call 'runFuncOnA' - OK
    aa: A = A@6a997956
    
    scala> val aa = new A { runFuncOnA } // Doesn't extend CakeLayer - bad!
    <console>:28: error: could not find implicit value for parameter cl: CakeLayer
           val aa = new A { runFuncOnA }
                            ^
    
    scala> val aWithCL = new A with CakeLayer // Extends CakeLayer, so calling 'runFuncOnA' is OK here:
    3
    aWithCL: A with CakeLayer = $anon$1@59bf1b79
    

    基本上,特征调用父类来反过来回调定义在特征上的特定方法,传递私有值。

    【讨论】:

    • 谢谢。我希望我的一个前提是错误的,或者会有一种不复杂的方式。所以让我们看看还会出现什么.. :) 看不出我将如何简化您建议的方案...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2013-01-09
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多