수색…


소개

스칼라의 범위는 값 ( def , val , var 또는 class )에 액세스 할 수있는 위치를 정의합니다.

통사론

  • 선언
  • 개인 선언
  • 비공개 [this] 선언
  • 비공개 [fromWhere] 신고
  • 보호 선언
  • protected [fromWhere] 선언

공개 (기본) 범위

기본적으로 범위는 public 이며 값은 어디서나 액세스 할 수 있습니다.

package com.example {
  class FooClass {
    val x = "foo"
  }
}

package an.other.package {
  class BarClass {
    val foo = new com.example.FooClass
    foo.x // <- Accessing a public value from another package
  }
}

사적인 범위

범위가 private 인 경우 현재 클래스 또는 현재 클래스의 다른 인스턴스에서만 액세스 할 수 있습니다.

package com.example {
  class FooClass {
    private val x = "foo"
    def aFoo(otherFoo: FooClass) {
      otherFoo.x // <- Accessing from another instance of the same class
    }
  }
  class BarClass {
    val f = new FooClass
    f.x // <- This will not compile
  }
}

전용 패키지 관련 범위

개인 값에 액세스 할 수있는 패키지를 지정할 수 있습니다.

package com.example {
  class FooClass {
    private val x = "foo"
    private[example] val y = "bar"
  }
  class BarClass {
    val f = new FooClass
    f.x // <- Will not compile
    f.y // <- Will compile
  }
}

개체 개인 범위

가장 제한적인 범위는 "개체 - 개인" 범위이며,이 값은 개체의 동일한 인스턴스에서 해당 값에 액세스 할 수있게합니다.

class FooClass {
  private[this] val x = "foo"
  def aFoo(otherFoo: FooClass) = {
    otherFoo.x // <- This will not compile, accessing x outside the object instance
  }
}

보호 된 범위

보호 된 범위를 사용하면 현재 클래스의 모든 하위 클래스에서 값에 액세스 할 수 있습니다.

class FooClass {
  protected val x = "foo"
}
class BarClass extends FooClass {
  val y = x // It is a subclass instance, will compile
}
class ClassB {
  val f = new FooClass
  f.x // <- This will not compile
}

패키지 보호 범위

package protected scope는 특정 패키지의 하위 클래스에서만 값에 액세스 할 수있게합니다.

package com.example {
  class FooClass {
    protected[example] val x = "foo"
  }
  class ClassB extends FooClass {
    val y = x // It's in the protected scope, will compile
  }
}
package com {
  class BarClass extends com.example.FooClass {
    val y = x // <- Outside the protected scope, will not compile
  }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow