2011-05-12 4 views
33

C#에서는 클래스를 internal으로 표시하여 동일한 패키지 내에서만 액세스 할 수 있습니다. Java와 비슷한 것이 있습니까?Java의 내부 클래스와 같은 것이 있습니까?

+3

http://stackoverflow.com/questions/2534733/java-protected-classes 가능한 복제본 – pintxo

+2

@cmmi : 완전히 다른 관점에서 묻는 질문이므로 중복되지는 않습니다. 그래도 같은 대답. –

+4

C#에는'packages'가 없습니다. 이름 공간과 어셈블리가 있습니다. 패키지는 네임 스페이스와 동일합니다. 그러나 어셈블리는 Java의 JAR 파일과 비교할 수 있습니다. 'internal' 수정자는 클래스를 어셈블리 안에서만 접근 가능하게 만듭니다. 따라서 이름 공간이나 패키지와는 아무런 관련이 없습니다. – nedR

답변

47

클래스 선언에서 보안 수정 자 (public, private)를 생략하여 패키지 개인 클래스를 작성할 수 있습니다.

package com.sample; 

class MyPackagePrivateClass 
{ 
    ... 
} 
+1

패키지가 어셈블리보다 캡슐화가 더 좋습니다 – hB0

+12

@ hB0 : 안 돼요! 다른 패키지로 참조 된 "내부"도우미 클래스를 어떻게 선언하겠습니까? 당신은 단순히 할 수 없다 – Lotfi

+1

내가 "소프트웨어 디자인의 더 좋은 방법"은 더 많은 기능을 집중적으로 사용하지 않는다는 것이다. (어느 MS가 언제나 함께 사용한다.) – hB0

6

액세스 한정자 삭제는 C#의 내부 규칙과 유사합니다.

C#을

public class A 
{ 
    public static int X; 
    internal static int Y; 
    private static int Z; 
} 
internal class B 
{ 
    public static int X; 
    internal static int Y; 
    private static int Z; 
    public class C 
    { 
     public static int X; 
     internal static int Y; 
     private static int Z; 
    } 
    private class D 
    { 
     public static int X; 
     internal static int Y; 
     private static int Z; 
    } 
} 

자바

public class A 
{ 
    public static int X; 
    static int Y; 
    private static int Z; 
} 
class B 
{ 
    public static int X; 
    static int Y; 
    private static int Z; 
    public class C 
    { 
     public static int X; 
     static int Y; 
     private static int Z; 
    } 
    private class D 
    { 
     public static int X; 
     static int Y; 
     private static int Z; 
    } 
} 

출처 : http://www.javacamp.org/javavscsharp/internal.html

+1

클래스 A, B, C, D가 같은 패키지에있는 경우에만 작동합니다. C#에서는 같은 네임 스페이스 (같은 어셈블리의 네임 스페이스가 아닌 – User1234

+6

@ User1234)에 있어야합니다. – Roland

1

예. 그것은 패키지 개인라고, 당신은 어떤 수정없이 클래스를 정의 : 당신은 클래스 패키지 현지 할 수

package com.blah; class Foo{ }

0

. 이것은 클래스의 기본 범위입니다. 즉 액세스 수정자가없는 위치입니다.

실제로 언젠가 넣기를 원한다면 예를 들어 주석을 만들 수 있습니다. @package_local, 나는 speicifc 패키지를 로컬 패키지로 만들고 싶지 않고 그냥 지정하지 않은 장소에서이 작업을 수행합니다.

0

예, 기본 (패키지 개인) 액세스 수준입니다. 클래스 정의에 액세스 수정자를 두지 않고 원하는 것을 얻을 수 있습니다.

1

는 전 C#에 익숙하지 해요,하지만 자바의 기본 보호는 뭔가 패키지 내에서만 액세스 할 수 있다는 것입니다 :

누구나 접근 할 수 = 공공

는 현재 클래스

내 접근 = 개인

는 패키지 내에서 또는 현재 클래스에서 패키지 내에서 접근

기본 =을 상속하는 모든 클래스에서 = 접근 보호

나는 항상 "현재 클래스에서 상속하지만 다른 어느 곳에서도이 패키지 또는 다른 어떤 클래스에서도 상속받을 수있는 클래스에서 액세스 할 수 있어야합니다."라고 말할 수있는 방법이 있어야한다고 생각했습니다. 그러나 그렇지 않습니다.

+1

마지막 코멘트에 대해 C#은 "내부를 보호했습니다" – projectshave

+0

@projectshave는 잘못하지 않았습니다. C#의 "protected internal"은 어셈블리에서 모두 액세스 할 수 있습니다. 실제로는 C# juse의 서브 클래스에만 클래스의 액세스를 제한하려면 "protected"를 사용하십시오. java에서는 "protected"가 동일한 패키지에서 하위 클래스에 액세스 할 수 있습니다. –

2

이 질문은 이전에 받아 들여지는 대답이 있지만, 그 대답은 .Net.

java에는 C#의 내부 한정자와 정확히 동일한 기능이 있습니까? 짧은 대답은 아니오입니다 (그러나 당신은 그것을 어떻게 얻을 수 있고 어떻게 말할 것인가?)!

내부 C#은 실제로 "어셈블리 - 개인"수정 자입니다. 어셈블리 란 무엇입니까?

총회는 프로젝트의 모든 제품 (C#에서 DLL 혹은 EXE - 자바에 상응하는 JAR 파일도 가능) 자바의 내부에 대한 정확한 해당이없는

. Bryan Kyle이 대답하고 받아 들인 것은 실제로 "package-private"(java의 패키지는 C#의 네임 스페이스와 동일합니다)이지만 어떤 것은 어떻게 대답되었는지는 동일한 결과를 얻는 가장 가까운 방법입니다.

내부와 완전히 동일한 결과를 얻는 방법은 무엇입니까? 위선적 인 자바는 이것을위한 해결책이 있습니까? 대답은 '예'입니다.

이 있습니다. 수식어는 포함하지 않습니다. 실제로이 작업을 수행하는 가장 좋은 방법은 패키징의 비밀입니다. 패킹의 가장 좋은 방법은 유형별이 아닌 관계식에 따라 클래스를 묶는 것입니다.

많은 사람들이 "모델"또는 "발표자"라는 패키지를 사용하고 모델이나 발표자를 모두 포함시킵니다. 이것은 잘못된 것입니다. 패키지는 "BookModel.java", "BookPresenter.java", .....

을 포함하는 "Book"과 같아야합니다. 이렇게하면 수식어를 생략하여 패키지 전용으로 만들 수 있으며 문제가 없습니다. 패키징의 우수 사례가 있으므로 패키지 개인 클래스가 필요한 모든 클래스에서 액세스하십시오.

관련 문제