2009-04-11 5 views
6

Java의 보호 된 클래스 구조?

하위 클래스의 멤버에게는 수퍼 클래스의 메서드가 보이지 않는 Java의 언어 기능이 있는지 궁금합니다.

 public class Subclass extends protected Superclass 

또는 무엇인가. 예를 들어 보겠습니다.

다음은 수퍼 클래스입니다.

public class A{ 
    public String getA(){...} 
    public String getB(){...} 
    public String getC(){...} 
    public void setA(String a){...} 
    public void setB(String b){...} 
    public void setC(String c){...} 
} 

A 메소드를 보호하면서 서브 클래스를 만들고 메소드를 오버라이드하지 않으면 액세스 수정자를 변경할 수 없으면 다음과 같이 끝낼 것입니다. -

public class B extends A{ 
    private String getA(){return super.getA();} 
    private String getB(){return super.getB();}//These four methods have 
    private void setA(String a){super.setA(a);}//to be redeclared. 
    private void setB(String b){super.setB(b);} 

    public String getC(){return super.getC();}//These two methods can be 
    public void setC(String c){super.setC(c);}//removed. 
    public String getD(){...} 
    public void setD(String d){...} 
} 

어떤 방법 으로든 다시 선언 할 필요가없는 방식으로 가져갈 수있는 것이 있습니까?

답변

10

C++의 상황과 달리 Java에서 "비공개"상속은 없습니다.

상속은 하위 유형 지정 관계를 만듭니다. B의 모든 인스턴스는 A의 인스턴스이기도하며 동일한 메시지에 응답해야합니다. B의 인스턴스가 A 인스턴스가 응답하는 모든 메시지에 명확하게 응답하지 않으면 상속은 부적절합니다.

마지막 솔루션 (B가 A에서 상속받지 않음)이 적절한 방법입니다. 하위 유형 지정 관계를 만들지 않고 다른 유형을 (비밀리에) 구현하려면 하나의 유형 만 사용하십시오.

+0

C + +와 비교하여 +1 (보호 및 개인 상속을 가짐). –

+0

고급 C++을 가르 칠 때, 서브 다이어그램 관계를 보여주기 위해 venn 다이어그램을 그렸고, 서브 클래스의 내부와 외부에 보이는 것을 보여 주면서 개념을 증명하는 것이 매우 효과적이라는 것을 알았습니다. 그러나 나는 종종 그것이 가치있는 것보다 더 어려움을 느꼈다. – Uri

2

슈퍼 클래스에서 필드/메소드를 비공개로 설정하는 것 이외에는이 방법을 고려하지 않았습니다.

내가 생각하는 최고의 최고의 클래스 B는 개인 클래스 A.

3

을 참조 내가 생각하지 않거나 할 수 있어야를 보유하고 두 번째 옵션을 것입니다.

B가 A를 확장하도록 상속을 사용하는 경우 B 개체를 A 개체로 사용할 수 있어야합니다. 예를 들어,이 가능할 것이다 :

A obj = new B(); 

이제 프로그램은 A의 public 메소드의 일부를 호출 할 수 있음을 알 수있는 방법이 있습니다.

상속없이 함수의 재정의는 불가피합니다.