/**
The protected modifier applies to class member definitions. Protected members of a class can be accessed from within
0a. the companion module of any of those classes
A protected identifier x may be used as a member name in a selection r.x only
if one of the following applies:
1a. The access is within the template defining the member, or,
if a qualification C is given,
1b. inside the package C, or
1c. the class C , or its companion module, or
2. r is one of the reserved words this and super, or
3. r’s type conforms to a type-instance of the class which contains the access.
4. A different form of qualification is protected[this]. A member M marked with this
modifier is called object-protected; it can be accessed only from within the object
in which it is defined. That is, a selection p.M is only legal if the prefix is this
or O.this, for some class O enclosing the reference. In addition, the restrictions
for unqualified protected apply.
*/
object E {
val e = new E
import e._
def n(a: A, b: B, c: C) = {
b.protE // 1c
c.protE // 1c
a.protE // 1c
A.protOE // 1c
}
}
class E {
object A {
protected def protO = 2
protected[E] def protOE = 3
protected[this] def protOT = 3
}
class A {
protected def prot = 2
protected[E] def protE = 3
protected[this] def protT = 4
// 1a
prot; protE; protT
def foo = {prot; protE; protT}
new { prot; protE }
def this(a: Any) = {this(); prot; protE; protT}
object B extends A {
A.this.prot
A.this.protE
A.this.protT
}
import A._
// 0a
protO
// 3
protOE
protOT // not allowed
}
class B extends A {
// 1b
this.prot; this.protE;
super.prot; super.protE;
// 4
this.protT
// 4 !!! "or the super keyword"
super.protT
def n(a: A, b: B, c: C) = {
b.prot // 3
c.prot // 3
a.prot // not allowed, prefix type `A` does not conform to `B`
b.protT // not allowed
c.protT // not allowed
a.protT // not allowed
}
}
object B {
def n(a: A, b: B, c: C) = {
b.prot // 3 !!!
c.prot // 3 !!!
// Wording of 3 seems insufficient, missing:
// "... (if the access is from a class), or
// the type instance of companion class (if the access is from a module)"
a.prot // not allowed
b.protT // not allowed
c.protT // not allowed
a.protT // not allowed
}
}
class C extends B
class Z {
def n(a: A, b: B, c: C) = {
b.prot // not allowed
c.prot // not allowed
a.prot // not allowed
b.protE // 2
a.protE // 2
c.protE // 2
b.protT // not allowed
c.protT // not allowed
a.protT // not allowed
}
}
}
class Other {
val e = new E
import e._
def n(a: A, b: B, c: C) = {
b.prot // not allowed
c.prot // not allowed
a.prot // not allowed
b.protE // not allowed
a.protE // not allowed
c.protE // not allowed
}
}