2012-07-25 2 views
5

이것은 숙제 인 질문입니다 : 다음 클래스 중 밀접하게 캡슐화되지 않은 것은 무엇입니까? 밀접하게 캡슐화 된 클래스

class A 
{ 
    private int x; 
} 
class B 
{ 
    private int x; 
    public void setX(int x) 
    { 
     this.x=x; 
    } 
    public int getX() 
    { 
     return x; 
    } 
} 
class C 
{ 
    private int x; 
    private void setX(int x) 
    { 
     this.x=x; 
    } 
    private int getX() 
    { 
     return x; 
    } 
} 

나는 coderanch에서 검색 시간을 소비하지만, 필요한 물건을 얻을 수 없습니다. 아무도 나를 도울 수 있습니까?

내가 생각하기에 클래스 C는 밀접하게 캡슐화되지 않았으므로 메서드가 비공개입니다. 그리고 클래스 A에 관해서는 그것이 캡슐화되지 않는다고 느낍니다. 캡슐화의 기본 정의에서는 "멤버를 숨기고 원하는 방식으로 동작하는 클래스 사용자에게 메서드를 제공해야합니다."라고 말합니다. 이제 클래스 A에는 접근 자 - 변경자 메서드가 없습니다. 따라서 A는 캡슐화 된 것으로 간주되어서는 안됩니다. 나는 확실하지 않지만. 내가 틀렸다면 나를 바로 잡아주세요.

+0

이 아마 개인 캡슐화되지 않습니다하지로 정의 하나 개의 멤버 변수를 포함하는 경우 모든 멤버 변수 비공개로 모든 클래스가 긴밀하게 캡슐화되어 NB로 선언 의미 당신을 도울 수는 없겠지만, 질문은 어리석은 추상 방식으로 제기됩니다 (아마 당신의 강사에 의해). 클래스는 클라이언트가 필요로하는 인터페이스만을 공개 할 때 밀접하게 캡슐화됩니다. 주어진 클래스의 목적을 모른 채 의미있게 말하기 란 거의 불가능합니다. – millimoose

답변

1

당신이 옳습니다. 엄격한 캡슐화는 공용 getter 및 setter와 쌍을 이루는 개인 필드를 의미하기 때문에 클래스 A와 클래스 C는 모두 밀접하게 캡슐화되지 않습니다.

+0

이제는 혼란 스럽습니다 ... A : 클래스 A B : 클래스 B C : 클래스 C D : 위에 없음 – user1500024

+2

내부에 대한 직접 액세스는 캡슐화를 의미합니까? – jeff

1

캡슐화의 정의가 정확합니다. 하지만 당신이 조금 길을 잃은 것 같아요.

캡슐화 란 다른 사람이 내선에 직접 액세스 할 수 없도록 함을 의미합니다. 사용자 기능을 노출하고 내부를 관리합니다.

그래서 은행 계좌 인 경우 총계라는 비공개 필드가 있습니다. 사용자가 직접 내 총계를 설정할 수는 없습니다. 대신, 나는 두 배 amt를 철회하고 두 배 amt를 예금하고 나는 필요에 따라 총계를 처리한다.

전용 멤버가있는 A에서만 끊어지지 마십시오. 사용자 기능이 표시되지 않고 다시 응답을 시도하는 것처럼 이러한 클래스 단편을 고려하십시오.

+0

실제로이 질문은 A, B, C 또는 없음 등급 인 의 4 가지 옵션으로 모집 적성 검사에서 묻습니다. 그 중 하나만 맞습니다. 가장 정확한 대답은 무엇입니까? – user1500024

+0

@ user1500024 옵션에서 벗어나세요? 'B'는 모든 내부 구조를 노출하고 'A'와 'C'는 아무 것도 노출시키지 않으므로 None이라고 말하고 싶습니다. 따라서 쓸모가 없습니다. 그 말은''B' '에 대답하기위한 논쟁이있다. 왜냐하면''x''를 노출하는 동안 접근하기 쉽기 때문이다. 'A'와'C'에 대해'x'를 전혀 노출시키지 않기 때문에 논쟁이있는 것처럼 말입니다. 엄청나게 애매한 질문 일뿐입니다. – millimoose

+1

전적으로 동의합니다 ... 나는 그런 질문을 한 사람을 구한다. – user1500024

4

클래스에 "밀폐 캡슐화"는 어떻게 정의되어 있습니까? Google 검색에서 알 수있는 한 학계 또는 업계 차원의 정의는 없습니다.

나는 각 클래스가 잘 캡슐화되어 있거나 각각 캡슐화가 잘되어 있지 않다고 주장 할 수있다. 클라이언트가 사적인 변수 X의 이름에 노출 된 이유는 무엇입니까? 불행한 것 같습니다. 클래스 A가 어떤 기능을 노출하지 않는 이유는 무엇입니까? C에서 getter를 사용해야하는 도메인에만 노출시키는 것이 "정확합니까?"

이 질문은 캡슐화의 개념을 잘못 표현한 것입니다. "캡슐화 확인 프로그램"루틴을 통해 코드를 실행할 수 없습니다. 그것은 노출되어야하는 것이고 그렇게되어서는 안된다고 말하는 인간의 디자인 결정입니다. 근본적으로 이것은 일반적으로 데이터를 비공개로해야하지만 메소드가 공개인지 비공개인지 여부는 전적으로 실제로 의미하고 수행중인 작업에 달려 있습니다.

0

공용 접근 장치의 필요성은 캡슐화의 정의에서 언급 할 수 있습니다. 이유는 단지 의미가 있기 때문입니다. 그래서 밀접하게 캡슐화 된 클래스는 멤버를 숨기고 다른 클래스의 객체로 직접 액세스하지 못하게하는 클래스라고 말하고 싶습니다. 그게 전부입니다. None으로 가고 싶습니다. 그 중 2 개가별로 의미가 없더라도 모든 클래스가 캡슐화되어 있기 때문입니다. 여기

0

클래스 B가 단단히 때문에 정의에 따라 캡슐화됩니다

0

모든 당신의 위 클래스가 긴밀하게 캡슐화 "클래스가 private 변수 & 공용 속성으로 선언 된 경우, 단단히 캡슐을이라고합니다."

클래스는 모든 데이터 멤버가 private로 선언 된 경우에만 단단히 캡슐화됩니다. 여기서 우리는 공공 접근 자나 돌연변이 체가 존재하는지 여부에 대해 걱정하지 않아야합니다.

-1

클래스는 모든 변수가 비공개로 선언 된 경우에만 경우 "엄격하게 캡슐화"이라고합니다. (그들은 게터 또는 세터 방법 여부를 포함에 관계없이합니다. 귀하의 예제 전체에서

을 각 클래스는 비공개로 모든 변수가 있기 때문에 세 개의 클래스는 긴밀하게 캡슐화됩니다. 당신에 의해 기술

0

모든 세 가지 클래스가 긴밀하게 캡슐화된다.

I을 클래스가 private 변수 만 가지고 있고 다른 public 변수가없는 경우 클래스는 밀접하게 캡슐화 된 클래스라고합니다.

getter 또는 setter 메서드에 의존하지 않습니다.

다른 클래스 나 함수에서 사용할 수 있도록 만들기 변수가 필요하므로 getter 및 Setters가 있어야합니다.

공용 getter 및 setter 메서드에 관계없이 모든 세 클래스는 밀접하게 캡슐화됩니다.

0

긴밀하게 캡슐화 된 클래스는 부모 클래스가 자식 클래스가 단단히