2010-06-06 6 views
5

C++에서 보호 된 액세스 지정자를 도입 한 이유는 무엇입니까? 예가 도움이 될 것입니다.보호 된 액세스 지정자에 대한 이론적 근거

+1

이론적 근거는 "컨설턴트가 악의적 인 작업에 많은 비용을 부과 할 수 있도록해야 할 때보 다 언어를 복잡하고 취약하게 만드는 데 필요한 것이 있습니다." –

답변

2

protected 액세스 수준은 클래스가 상속자와 함께 사용해야 할 때 사용됩니다.

예를 들어, 해당 영역을 외부 세계에보고 할 수있는 추상 Shape 클래스를 상상해보십시오.

삼각형, 정사각형 및 원과 같은 모양이 다르게 (각도, 측면, 반경) 설명되고 해당 영역을 다르게 계산합니다.

클래스는 해당 영역을 보유하는 개인 변수를 반환하는 public getArea() 메서드를 가질 수 있습니다.
이 변수를 설정하는 가장 좋은 방법은 자식 클래스에서 호출하는 setArea(double)이라는 protected 메서드입니다.

따라서, Circle이 반드시 좋은 디자인 아니라고 등

참고 setArea(side * side)을 부를 것이다 setArea(PI * radius * radius), Square을 부를 것이다 (하지만 protected의 좋은 예입니다) 이러한 종류의

+1

아마도 가장 좋은 방법은 가상'getArea' 메소드를 사용하는 것입니다. –

+0

@Matthieu : 그렇습니다.하지만 호출 할 때마다 영역을 다시 계산해야합니다. – SLaks

+2

반드시 결과를 캐싱 할 가치가 있는지 여부를 결정하는 것은 파생 형식에 달려 있습니다. –

3

질문, 나는 Bjarne Stroustrup의 C++의 디자인 그리고 발전을 추천한다. 13.9 절은 보호 된 구성원의 발전을 설명합니다. 릴리스 1.0 [Cfront의, 마크 린튼 내 사무실에 의해 중지 및 액세스 제어의 세 번째 수준에 대한 열정적 인 탄원을 만든 직후

는 [...] 그는 설득력 실제 코드에서 정품 경험과 사례를 기반으로 주장 보호 된 데이터는 효율적이고 확장 가능한 X 윈도우 도구 키트의 설계에 필수적이었습니다. [...] 이들은 훌륭한 주장이었고 본질적으로 보호받는 구성원을 허용하도록 설득 한 것들입니다. [...]

5 년 정도 후, 마크는 [이 언급 한 X 윈도우 툴킷 이전] 그들이 버그의 원천이되었다 때문에 인터뷰에서 보호 된 데이터 멤버의 사용을 금지했다. [...] 그들은 또한 심각하게 유지 보수를 복잡하게한다 [...]

보호 된 회원은 릴리스 1.2에 도입되었습니다. 보호 된 기본 클래스는 릴리스 2.1에서 처음 설명되었습니다. 되돌아 보면, 나는 protected이 "좋은 주장"과 유행이 새로운 특징을 받아들이 기위한 나의 더 나은 판단과 나의 엄지 손가락 규칙을 극복 한 사례라고 생각한다.

+2

더 이상 동의 할 수 없습니다. 보호 된 데이터 멤버는 캡슐화에 위배됩니다. 나는 메소드를 위해서만 protected를 사용한다. –

+0

@Matt : 제 생각에 클래스의 필드는 공개 필드와 보호 된 필드 모두 캡슐화를 깨뜨리기 때문에 암시 적으로이를 막는 메커니즘이없는 private이어야합니다. – fredoverflow

+1

나는 아주 똑같은 견해를 가지고 있습니다.데이터 멤버를 공개하는 경우 클래스 불변성을 적용 할 수 없습니다. –

관련 문제