이 흥미로운 실에 이미 몇 가지 답변이 추가되었지만 이 행동이 왜 그런지에 대한 진정한 이유를 찾지 못했습니다 . 시도해 보겠습니다.
옛날에
80 년대의 스몰 토크와 90 년대 중반의 자바 사이에서 객체 지향의 개념이 발전했다. 원래 OO에서만 사용할 수있는 개념으로 생각되지 않은 정보 숨기기 (1978 년에 처음 언급 됨)는 클래스의 모든 데이터 (필드)가 개인용이므로 모든 방법이 공개되므로 스몰 토크에 도입되었습니다. 90 년대 OO의 많은 새로운 개발 과정에서 Bertrand Meyer는 그의 획기적인 책 OOSC (Object Oriented Software Construction) 에서 OO 개념의 상당 부분을 공식화하려고 시도했습니다. )에서 OO 개념과 언어 설계에 대한 (거의) 결정적인 참조로 간주 된 .
개인의 가시성의 경우
Meyer에 따르면 정의 된 클래스 세트 (192-193 페이지)에 메소드를 사용할 수 있어야합니다. 이것은 분명히 매우 세분화 된 정보 숨기기를 제공하며, 클래스 A 및 클래스 B 및 모든 하위 항목에 다음 기능을 사용할 수 있습니다.
feature {classA, classB}
methodName
의 경우에는 private
그 다음은 말한다 : 명시 적으로 자신의 클래스에 볼 수와 같은 유형을 선언하지 않고, 당신이 액세스 할 수없는 자격을 갖춘 호출 기능 (방법 / 필드) 그. 즉 x
, 변수 인 경우 x.doSomething()
허용되지 않습니다. 물론 클래스 자체 내에서 무단 액세스가 허용됩니다.
다시 말해, 같은 클래스의 인스턴스에 의한 액세스를 허용하려면 해당 클래스에 의한 메소드 액세스를 명시 적으로 허용해야합니다. 이를 인스턴스 전용 대 클래스 전용이라고도합니다.
프로그래밍 언어의 인스턴스 전용
클래스 개인 정보 숨기기와는 달리 인스턴스 개인 정보 숨기기를 사용하는 현재 사용중인 두 개 이상의 언어를 알고 있습니다. 하나는 Meyer가 디자인 한 언어 인 Eiffel으로 최대한의 OO를 필요로합니다. 다른 하나는 오늘날 훨씬 더 일반적인 언어 인 루비입니다. 루비에서 "이 인스턴스에 대한 개인 정보"를private
의미합니다. .
언어 디자인을위한 선택
인스턴스 전용을 허용하는 것이 컴파일러에게는 어렵다고 제안되었습니다. 나는 자격있는 메소드 호출을 허용하거나 허용하지 않는 것이 비교적 간단하기 때문에 그렇게 생각하지 않습니다. 개인 방법의 경우 doSomething()
허용되며x.doSomething()
되지 않는 경우 언어 디자이너는 개인용 메서드 및 필드에 대한 인스턴스 전용 액세스 가능성을 효과적으로 정의합니다.
기술적 인 관점에서 볼 때 어떤 방법이든 다른 방법을 선택해야 할 이유가 없습니다 (Eiffel.NET이 IL을 사용하여이 작업을 수행 할 수 있다고 생각할 때 (여러 상속에도 불구하고이 기능을 제공하지 않는 고유 한 이유는 없습니다)).
물론 그것은 취향의 문제이며 다른 사람들이 이미 언급했듯이 개인 메서드와 필드에 대한 클래스 수준의 가시성이 없으면 일부 메서드를 작성하는 것이 더 어려울 수 있습니다.
C #에서 클래스 캡슐화 만 허용하고 인스턴스 캡슐화는 허용하지 않는 이유
인스턴스 캡슐화에서 인터넷 스레드를 살펴보면 (언어가 클래스 수준이 아니라 인스턴스 수준에서 액세스 수정자를 정의한다는 사실을 나타내는 데 사용되는 용어 인 경우가 종종 있음) 개념이 찌그러집니다. 그러나 일부 현대 언어는 적어도 개인 액세스 수정 자에 대해 인스턴스 캡슐화를 사용한다는 점을 고려하면 현대 프로그래밍 세계에서 사용할 수 있고 사용 중이라고 생각합니다.
그러나 C #은 언어 디자인을 위해 C ++ 및 Java를 가장 열심히 살펴 보았습니다. Eiffel과 Modula-3도 그림에 있지만 Eiffel missing (다중 상속)의 많은 기능을 고려할 때 개인 액세스 수정 자에 관해서는 Java 및 C ++와 동일한 경로를 선택했다고 생각합니다.
왜 당신이 Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg 또는 C # 표준에서 일한 다른 사람을 잡아야 하는 이유 를 알고 싶다면 . 불행히도 주석 이 달린 C # 프로그래밍 언어 에서 명확한 메모를 찾을 수 없습니다 .