많은 공용 속성이 있고 완벽하게 사용 된 기본 클래스를 만들었습니다. 이제이 클래스를 사용하여 다른 클래스를 파생 시키려고하지만, 상속받는 파생 클래스 외부에 일부 속성이 노출되기를 원하지 않습니다. public 인 기본 클래스의 속성을 파생 클래스 외부에 노출 할 수없는 방법이 있습니까 (숨겨야 할 속성은 상속 된 다른 클래스에서 사용되기 때문에 public 임). 어떤 도움도 고도로 이세화 될 것입니다.기본 클래스 속성의 가시성 감소
답변
protected으로 만들고 싶습니다.
MSDN :
보호 된 멤버는 해당 클래스 및 파생 클래스 인스턴스를 통해 액세스 할 수 있습니다.
+1,하지만 명확성을 위해, 당신은 그들이 기본 클래스에서 * 보호 될 필요가 있음을 추가 할 수 있습니다. * 그는이 걸릴 수 있습니다 파생 클래스에서 가시성을 변경할 수 있음을 의미합니다. –
그는 파생 클래스가 아닌 기본 클래스에 공개 속성을 원하는 것처럼 보이므로 원본 질문의 주석에 표시된대로 Liskov 원칙에 위배됩니다. – bdparrish
@bdparrish 그게 내가 마지막 문장까지 두 번째를 읽을 때까지 생각했던 것이다. "숨겨야 할 속성은 상속받은 다른 클래스에서 사용되기 때문에 공용입니다." – cadrell0
내가 그들을 보호 마킹에 대한 cadrell0에 동의하지만, 단지의 경우는 속성이 실제로 public
있는 솔루션을 찾고 있습니다 만, 특정 파생 클래스의 사용자에 숨겨진, 당신은 explicit interface
interface IHaveMethodsYouCanHide { void Foo(); }
class Base : IHaveMethodsYouCanHide { public void Foo() {} }
class NonHidingDerived : Base { }
class HidingDerived : Base, IHaveMethodsYouCanHide
{
void IHaveMethodsYouCanHide.Foo() {}
}
을 사용할 수 있습니다
이 코드를 사용하면 HidingDerived 유형의 식별자는 Foo에 대한 호출을 허용하지 않습니다 (IHaveMethodsYouCanHide에 처음 형변환하지 않는 한).
당신이 원하는 것은 단순히 불가능합니다. B 형이 A 형으로부터 상속 받으면 "A 형"A 형은 적어도 A 형과 동일한 접근 가능한 계약을가집니다. 이 계약을 근본적으로 위반하지 않고 A의 공개 회원을 숨길 방법이 없습니다.
A를 사용하지만 속성의 하위 집합 만 노출하려는 경우에는 상속이 적절한 솔루션이 아닙니다. 봉쇄가 적절한 솔루션입니다.
public class B {
private A m_wrapped;
// Expose only the properties you want to expose here
}
파생 된 유형의 기본 유형 멤버를 숨길 수 있으며 명시 적 인터페이스 구현 – payo
@payo를 사용하여 기존 답변을 읽으십시오. 이는 기존 멤버의 가시성을 변경하지 않습니다. 파생 상품의 인스턴스가 보스에 대한 참조에서 표시 될 때 여전히 액세스 할 수 있습니다. – JaredPar
파생 클래스의 사용법에서 볼 수있는 것처럼 가시성이 변경됩니다 (식별자가 기본 유형이됨을 제한하는 것도 참조). 원래의 질문은 숨길 방법을 묻는 질문 일 수 있고 내 대답은 숨기기가 가능한 한 가지 해결책을 보여주기 때문에이 구분을하는 것이 중요하다는 것을 알았습니다. – payo
- 1. 기본 클래스 이름 지정 및 가시성 질문
- 2. PHP 클래스 가시성
- 3. 기본 감소 루프 - PYTHON
- 4. getDefinitionByName() 및 클래스 가시성
- 5. 테스트 클래스 가시성
- 6. 클래스 속성의 기본값 설정
- 7. C++ 가상 상속, 클래스 가시성?
- 8. Google지도의 정밀도 감소 GeoPoint 클래스
- 9. 클래스 속성의 반올림
- 10. 클래스 속성의 람다 식
- 11. ContentControls에 대한 DataTemplate 기본 가시성
- 12. 정적 중첩 클래스 가시성 문제
- 13. 변경 클래스 템플릿 멤버 가시성
- 14. data- * 속성의 기본 변수 조작
- 15. 사용하지 않는 클래스 속성의 경우
- 16. 클래스 속성의 값에 변수가 있습니까?
- 17. StackPanel 변환기를 통한 가시성 및 IsEnabled 속성의 동적 바인딩
- 18. PHP의 클래스 메서드의 기본 표시
- 19. CSS 속성 : 표시와 가시성
- 20. 템플릿 열과 기본 데이터의 바인딩 가시성
- 21. 프로그래밍 감소
- 22. 유닛 테스트 Groovy 클래스 스프링 및 가시성
- 23. 부모 클래스 속성에 대한 Silverlight 바인딩 가시성
- 24. 안드로이드 단위 테스트와 클래스 멤버의 가시성
- 25. COM 클래스 가시성 : C#에서 VB6
- 26. 내부 클래스 멤버/특성 가시성 (C#)
- 27. 기본 유형과 기본 클래스
- 28. Java 인터페이스 감소,뿐만 아니라
- 29. 기본 클래스
- 30. 속성의 기본 이미지 만 가져 오기
http://en.wikipedia.org/wiki/Liskov_substitution_principle –