Latest web development tutorials

스칼라 액세스 한정자

스칼라와 자바 액세스 한정자, 각각 기본 같은 공개, 보호, 개인.

당신이 액세스 수정 문자를 지정하지 않으면 기본적으로 액세스 수준 스칼라 개체가 공개됩니다.

전용 자바보다 엄격 중첩 클래스의 경우에, 외부 클래스 심지어 중첩 될 수없는 수준의 액세스 전용 멤버의 스칼라 규정.


개인 (개인) 회원

개인 키워드를 수정,이 마크가있는 회원은 클래스 나 개체 멤버가 볼 내부 정의가 포함되어, 동일한 규칙은 내부 클래스에 적용됩니다.

class Outer{
    class Inner{
    private def f(){println("f")}
    class InnerMost{
        f() // 正确
        }
    }
    (new Inner).f() //错误
}

F는 비공개로 선언되어 있기 때문에 (새로운 내부) .F () 액세스 내부에서의 법률이 아니라 액세스 내부의 범주 내에 있지 않습니다.

액세스 F 있지만 구경이 클래스 내부에 포함되어 있기 때문에 내측에서 아무런 문제가 없다.

이 내부 클래스의 외부 액세스 클래스 전용 부재를 허용하기 때문에 자바 모두에 액세스 할 수있다.


보호 (보호) 회원

스칼라에서 (보호) 회원은 자바보다 더 엄격한 액세스 보호입니다. 그것이 단지 서브 클래스의 멤버의 보호 클래스의 멤버에 정의 할 수 있기 때문에 액세스된다. Java에서는, 다른 종류의 패키지는 또한 액세스 될 수와 멤버를 액세스 할 수있는 클래스의 서브 클래스 정의에 더하여, 개질 된 키워드 보호 부재를 사용한다.

package p{
class Super{
    protected def f() {println("f")}
    }
	class Sub extends Super{
	    f()
	}
	class Other{
		(new Super).f() //错误
	}
}

F는 슈퍼에서 보호로 선언되어 있기 때문에 위의 예는, 액세스의 하위 유형, F에 대한 문제가되지 않습니다, 그리고 슈퍼 서브는 서브 클래스입니다. 슈퍼로부터 상속을 다른 없으므로 반면, 기타은 F에 대한 액세스가 허용되지 않는다. 후자는 때문에 같은 가방에 다른 하위로, 자바 인식되고있다.


공공 (공용) 회원

어떤 수식을 지정하지 않으면 스칼라, 기본은 public입니다. 이러한 부재 어디에도 액세스 할 수있다.

class Outer {
   class Inner {
      def f() { println("f") }
      class InnerMost {
         f() // 正确
      }
   }
   (new Inner).f() // 正确因为 f() 是 public
}

보호의 범위

스칼라는, 상기 액세스 개질제 한정자를 이용하여 강조 할 수있다. 형식은 다음과 같습니다

private[x] 

或 

protected[x]

x는 패키지를 의미 어디 클래스 또는 단일 개체에 속한다. 개인 [X]로 작성하는 경우의 멤버로 또한 "읽기 [...] 또는 클래스에 [...] 다른 모든 클래스의 외부에 표시 패키지의 클래스와 연관된 이미지의 개인이다.

이 기술은 프로젝트 볼 외부 고객에 여러 개의 하위 패키지를 정의 할 수 있지만 프로젝트가 항상 눈에 보이지 않는 물건을 가지고 패키지, 대형 프로젝트의 숫자에서 유용합니다.

package bobsrocckets{
    package navigation{
        private[bobsrockets] class Navigator{
         protected[navigation] def useStarChart(){}
         class LegOfJourney{
             private[Navigator] val distance = 100
             }
            private[this] var speed = 200
            }
        }
        package launch{
        import navigation._
        object Vehicle{
        private[launch] val guide = new Navigator
        }
    }
}

위의 예는, 클래스 네비게이터가 비공개로 표시된다 bobsrockets 즉 패키지에 포함 된 모든 클래스와 객체의 클래스가 표시 bobsrockets입니다.

대상 차량 패키지 출시에 포함하기 때문에, 반대로, 패키지를 실행 bobsrockets있는 반면, 예를 들어, 네비게이터의 객체에 차량 접근에서 클래스 네비게이터 액세스 할 수 패키지 bobsrockets 외부 코드를 모두 허용된다.