Menu

#289 Composition Access Error

4.0*
open
nobody
None
5
2019-03-28
2019-03-28
No

If an object creates another object, the second object has access to the first object's protected and private methods. This behavior was not allowed in Itcl 3.4. For example:

package require Itcl

itcl::class A {

    constructor {} {
        B #auto $this
    }

    protected method protectedMethod {} {
        puts protectedMethod
    }

    private method privateMethod {} {
        puts privateMethod
    }
}

itcl::class B {

    constructor {a} {
        $a protectedMethod
        $a privateMethod
    }
}

A #auto

Object A passes itself to Object B, which is then able to call protected and private methods in A:

protectedMethod
privateMethod

In Itcl 3.4, the result is:

bad option "protectedMethod": should be one of...
  a0 cget -option
  a0 configure ?-option? ?value -option value...?
  a0 isa className
    while executing
"$a protectedMethod"
    while constructing object "::A::b0" in ::B::constructor (body line 2)
    invoked from within
"B #auto $this"
    while constructing object "::a0" in ::A::constructor (body line 2)
    invoked from within
"A #auto"

Discussion


Log in to post a comment.