2012-03-01 3 views
0

많은 공용 속성이 있고 완벽하게 사용 된 기본 클래스를 만들었습니다. 이제이 클래스를 사용하여 다른 클래스를 파생 시키려고하지만, 상속받는 파생 클래스 외부에 일부 속성이 노출되기를 원하지 않습니다. public 인 기본 클래스의 속성을 파생 클래스 외부에 노출 할 수없는 방법이 있습니까 (숨겨야 할 속성은 상속 된 다른 클래스에서 사용되기 때문에 public 임). 어떤 도움도 고도로 이세화 될 것입니다.기본 클래스 속성의 가시성 감소

+6

http://en.wikipedia.org/wiki/Liskov_substitution_principle –

답변

5

protected으로 만들고 싶습니다.

MSDN :
보호 된 멤버는 해당 클래스 및 파생 클래스 인스턴스를 통해 액세스 할 수 있습니다.

+0

+1,하지만 명확성을 위해, 당신은 그들이 기본 클래스에서 * 보호 될 필요가 있음을 추가 할 수 있습니다. * 그는이 걸릴 수 있습니다 파생 클래스에서 가시성을 변경할 수 있음을 의미합니다. –

+0

그는 파생 클래스가 아닌 기본 클래스에 공개 속성을 원하는 것처럼 보이므로 원본 질문의 주석에 표시된대로 Liskov 원칙에 위배됩니다. – bdparrish

+0

@bdparrish 그게 내가 마지막 문장까지 두 번째를 읽을 때까지 생각했던 것이다. "숨겨야 할 속성은 상속받은 다른 클래스에서 사용되기 때문에 공용입니다." – cadrell0

1

내가 그들을 보호 마킹에 대한 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에 처음 형변환하지 않는 한).

1

당신이 원하는 것은 단순히 불가능합니다. B 형이 A 형으로부터 상속 받으면 "A 형"A 형은 적어도 A 형과 동일한 접근 가능한 계약을가집니다. 이 계약을 근본적으로 위반하지 않고 A의 공개 회원을 숨길 방법이 없습니다.

A를 사용하지만 속성의 하위 집합 만 노출하려는 경우에는 상속이 적절한 솔루션이 아닙니다. 봉쇄가 적절한 솔루션입니다.

public class B { 
    private A m_wrapped; 

    // Expose only the properties you want to expose here 
} 
+0

파생 된 유형의 기본 유형 멤버를 숨길 수 있으며 명시 적 인터페이스 구현 – payo

+0

@payo를 사용하여 기존 답변을 읽으십시오. 이는 기존 멤버의 가시성을 변경하지 않습니다. 파생 상품의 인스턴스가 보스에 대한 참조에서 표시 될 때 여전히 액세스 할 수 있습니다. – JaredPar

+0

파생 클래스의 사용법에서 볼 수있는 것처럼 가시성이 변경됩니다 (식별자가 기본 유형이됨을 제한하는 것도 참조). 원래의 질문은 숨길 방법을 묻는 질문 일 수 있고 내 대답은 숨기기가 가능한 한 가지 해결책을 보여주기 때문에이 구분을하는 것이 중요하다는 것을 알았습니다. – payo