2015-10-02 2 views
0

Каким может быть простой способ сделать доступным частным членом класса доступным с помощью типизированной черты с типом этого класса?Доступ к частному члену в свойстве типизированной типизации - без возможности доступа к обтеканию

Кажется, что protected выполняет эту работу, но AFAIK разрешает доступ также для подклассов, которые являются слишком широкими, чтобы охватить область видимости для меня, если только черты с собственными типами и подклассами более тесно связаны, чем я себе представляю. Можете ли вы пролить свет на это?

Код скрипка:

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

class A { 
    protected val a: Int = 3 
} 

Для меня, семантики самостоятельных напечатали черты сильно отличается от тех, подкласса, когда я использую его для шаблона торта: Я не хотел бы любой подкласса иметь доступ, но только конкретную типизированную черту.

ответ

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 не скомпилируется:

scala> val aa = new A // Doesn't call 'runFuncOnA' - OK 
aa: A = [email protected] 

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 = [email protected] 

в принципе, черта призывает родительского класса в свою очередь обратного вызова конкретного метода определяется по признаку, передавая личное значение.

+0

Спасибо. Я надеялся, что одно из моих помещений ошибочно, или было бы неразборчиво. Итак, давайте посмотрим, что еще придумает .. :) не вижу, как я упростил бы вашу любезно предложенную схему ... – matanster

Смежные вопросы