2013-04-09 1 views
0

상위 클래스에 모든 필드가 있는데 하위 클래스에 상속되어야하는 필드가있는 경우 하위 클래스를 상위 클래스에 중첩시키고 필드를 보호하도록하는 것이 좋습니다. 개인적으로 사용하거나 보호 된 접근자를 사용합니까? 아니면 다른 대안?자바로 보호되는 'getters'와 중첩 된 클래스

+0

귀하의 유스 케이스에 크게 달려 있으므로 조금 더 자세히 설명해 주시겠습니까? –

+0

더 나은 것을 정의하십시오. –

+0

필자는 자신의 하위 클래스 (직원 유형) 및 일부 지불/세금 계산 방법 (추상 및 콘크리트)에 공통적 인 많은 데이터를 보유하고있는 수퍼 클래스 (Employee)를 보유하고 있습니다. 하위 클래스는 수퍼 클래스의 필드에서 데이터를 필요로하는 많은 계산을 수행합니다. 이 계열의 외부에서 액세스해야하는 필드는 거의 없습니다. –

답변

3

가장 쉬운 해결책은 수퍼 클래스 필드 또는 인스턴스 변수를 보호하는 것입니다. 그러나 비공개로 만들면 캡쳐의 원칙을 준수하기 때문에 개념적으로 게터와 설정자를 통해 액세스 할 수 있습니다.

1

가장 간단한 해결책은 필드를 보호하도록하는 것입니다. 그렇지 않으면 강력한 이유가없는 한 그걸로 가십시오.

1

나는 보호 된 접근자를 사용하는 것이 가장 좋은 방법이라고 생각합니다.

1

하위 클래스에서 액세스 할 수있게하려면 public 및 protected의 두 가지 옵션 만 남겨 둡니다. 아마도 보호는 당신이 원하는 것일 것입니다. 아래 표는 상속을 위해 java에서 extends 키워드를 사용할 때 적용됩니다.

   Access Levels 

Modifier Class Package Subclass World 
public  Y  Y  Y   Y 
protected Y  Y  Y   N 
no modifier Y  Y  N   N 
private  Y  N  N   N 

수퍼 클래스에 하위 클래스를 중첩하면 개인용도 사용할 수 있습니다. 이것은 내부 클래스가 부모 클래스의 PART이기 때문에 private 메소드에도 액세스 할 수 있기 때문입니다.

public class Parent { 
    private int x = 5; 

    //Not really a subclass 
    private class NestedClass { 
     public NestedClass() { 
      int hax = new Parent().x; // Works! 
     } 
    } 

    //More of a nestedclass than a subclass. 
    private class SubClass extends Parent { 
     public SubClass() { 
      int stillHax = new Parent().x; 
     } 
    } 
} 

당신은 당신이 extends 또는 implements 키워드를 사용할 때까지 당신은 아마 서브 클래스 (다른 파일에) 상위 클래스를 확장을 할 수 있도록 당신이 상속을 사용하지 않고 변수 보호 (또는 공용) 것 레벨 액세스. 동일한 pakage 또는 동일한 클래스에 속하는 것은 그리드에서 prority를 ​​취합니다. 위의 두 예제는 SAME 클래스의 다른 클래스가 부모 클래스와 같기 때문에 작동합니다.

그리드를 따라하면됩니다.

1

보호 된 필드 또는 보호 된 접근 자 메서드가 노출되는 경우가 있습니다. 그래서 모두 부모 클래스에 대한 디자인에 달려 있으며, 어떻게 하위 클래스가 부모 클래스를 사용하게할까요?

그러나 확실히 그 중 하나입니다. "하위 클래스를 수퍼 클래스에 중첩시키는 것이 더 낫습니다."< - 이것은 거의 올바른 선택이 아닙니다.

+0

고마워, 나는 그것을 명심할 것이다. –