2011-01-18 3 views
3

는 :의 C# - 클래스 디자인 및 액세스 수정 다음 감안할 때

public abstract class Base 
{ 
    // other stuff 

    public static void StaticMethod() 
    { 
    PrivateMethod(); 
    } 
    // here should be PrivateMethod() declaration somehow 
} 
public sealed class Derived: Base 
{ 
    // other stuff 

    public void InstanceMethod() 
    { 
    // call somehow PrivateMethod 
    PrivateMethod(); 
    } 
} 

나는 2 개의 다른 컨텍스트 (다른 ​​어셈블리)에서 PrivateMethod()의 사용을 확인해야합니다. Base.StaticMethod()을 호출하고 파생 클래스 d.InstanceMethod();의 인스턴스를 사용하여 두 번째로 호출하십시오.

기본 클래스 내에서 PrivateMethod()를 디자인하는 방법을 찾고 있습니다. 물론 PrivateMethod()는 Base 클래스와 Derived 클래스 외부에서 볼 수 없어야합니다.

나에 대해 뭔가 생각

"보호 정적 PrivateMethod을() {}"하지만 난 그렇게 안 읽어 ...

너희들은 무엇을 권장합니까?

+0

어쩌면 요구 사항을 변경할 수 있으며이 경우에는 다른 해결책을 찾을 수 있습니다. 그러나이 경우에는 선택할 수있는 정적 방법이 하나뿐입니다. –

+1

당신은 그것을해서는 안되는 것을 어디에서 읽습니까? 왜 그렇게하지 않아야합니까? –

+0

내가 생각하기에 : http://blogs.msdn.com/b/brada/archive/2004/09/09/227332.aspx. 그러나 Brad는 이것을 피하고 "사용하지 마십시오"라고 제안합니다. –

답변

2
protected static void PrivateMethod() {} 

괜찮습니까 (이름과 구별 됨) 그리고 필요한 것을 수행합니다. Derived에서 호출 할 때는 base.이 필요하지 않습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 문제는 내가이 링크를 확인한 후에이 질문을 시작했다는 것입니다 : http://blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx ... 아마도 내가 거기에서 뭔가를 이해할 수 있을까요? – Learner

+0

어쩌면 나는 기사의 마지막 절을 잘못 이해하고있다. – Learner

+0

(빠른 읽기 이후) 저자는 이것을 "보안으로 캡슐화"관점에서 생각합니다. lib 디자이너에는 유효하지만 응용 프로그램에는 적합하지 않습니다. 요점은 다음과 같을 것입니다 : 당신은 그것에 대해 솔직하게 공개 할 수 있습니다. –

2

나는 전에 이것을 들어 본 적이 없었으므로, 나는 당신이 말한 것을 말한 것을 찾아 보았습니다. 이 기사는 New Design Guideline: Avoid Protected Static입니다. 그러나 보호 된 정적 필드에 대해서만 이야기합니다.

나는 기사가 실제로 말하려고하는 것에 대해 좋은 사례를 만든다고 생각하지 않는다. 보호 된 통계가 합병증을 일으킬 수있는 방법을 설명하는 것보다 모든 사람이 액세스해서는 안되는 무언가에 올바른 액세스 플래그를 설정하지 않는 기본 클래스 디자이너의 아주 간단한 예를 사용합니다.

그렇다고해서 정적을 보호하면 합병증이 생길 수 있다는 지적이 있습니다. Protected static은 모든 하위 클래스가 언제든지 메서드를 호출 할 수 있음을 의미합니다. 이 방법이 순진하게 쓰여지는 경우 스레드 안전 문제가 발생할 수 있습니다. 기사가 "그것을하지 않으면 조심하십시오"보다는 "하지 마라"라고 쓰여진 것처럼 보입니다.

+0

귀하의 추천에 감사드립니다. 정말 도움이되었다! 건배! – Learner

0

여러분은 파생 클래스의 InstanceMethod()에서 StaticMethod()을 public으로 호출 할 수 있습니다. 어쨌든 PrivateMethod()으로 간접적으로 연결되기 때문입니다. 그렇게하면 PrivateMethod()은 비공개로 남겨 둘 수 있습니다. 구현은 것 같은 뭔가 :

public abstract class Base 
{ 
    // other stuff 

    public static void StaticMethod() 
    { 
    PrivateMethod(); 
    } 

    // here should be PrivateMethod() declaration somehow 
    private static void PrivateMethod() 
    { 
    // do stuff 
    } 
} 
public sealed class Derived: Base 
{ 
    // other stuff 

    public void InstanceMethod() 
    { 
    // call somehow PrivateMethod 
    StaticMethod(); 
    } 
} 

PS :이 중 하나를 매개 변수로 전달하거나 반사를 통해 판단 할 수있는 외부 발신자 또는 (InstanceMethod에서) 파생 클래스 발신자를 구분하는 StaticMethod를하는 동안이 필요됩니다.

+0

"Artur Mustafin"과 비슷한 것을 지적하고 싶다고 생각하지만 솔루션에 감사드립니다. InstanceMethod는 StaticMethod가 아닌 PrivateMethod를 호출해야합니다. – Learner

관련 문제