2010-02-16 2 views
2

에서이 질문이 하나와 유사한 : Restrict method access to a specific class in C++생성 제한 방법/필드는 C#을

그러나, 내 질문은 C#을위한 것입니다.

다시 말해 : 두 클래스가 있습니다. 예를 들어 FooBar이 단단히 결합되어 있습니다. Foo은 내가 단지 Bar에 액세스 할 수있는 방법을 공개합니다.

나는 실제로 원하는 것을 생각하지만 실제로 어떻게 할 것인지 전혀 모르고 있거나 간단한 방법이 있는지 알고 있습니다. (new StackFrame(1)).GetMethod().DeclaringType을 사용하여 액세스를 거부하는 일종의 특성을 사용하는 것이 포함됩니다. 내가 가서으로 업데이트 할 예정입니다 -

public class Foo { 

    [RestrictedUsage(Allow=typeof(Bar))] 
    public int SomeMethod() 
    { 
     // do something 
    } 

} 

내가 질문 (내가 여기 새로 왔어)에 대한 누락 아마 관련 세부 사항이 있습니다 사용법은 다음과 같이 보일 것입니다.

UPDATE : 내가 Foo 내가 수정하려고 행동의 기존 UIElement 감싸는 것을 언급해야한다. 수업은 봉인되어 있기 때문에 정상적으로 수정하기가 어렵습니다. Bar은 값을 올바른 값으로 변환하는 클래스입니다. Bar은 UI가 아니며 내 애플리케이션의 다른 위치에서 사용됩니다. Foo 값을 변환하는 방법을 알지 못합니다 (복잡합니다 - 그게 Bar에 해당합니다). 그래서 기본 메서드를 래핑 할 수 없습니다.

Jon Skeet은 내가 기대했던 답변을 주었다. (모든 덕분에 지금까지 그에게 달려있다.)하지만 어느 대답도 적절하지 않다고 생각한다.

은 이미 잘못된 속성을 참조하는 코드에서 실수를했습니다 ...

답변

6

두 가지 옵션 :

    별도의 어셈블리에 푸와 바 넣어
  • , 그리고 푸의 방법은 내부하게
  • Bar를 Foo 내에서 중첩 된 클래스로 만들고

바코드를 중첩 된 클라우드로 만드는 것이 더 일반적입니다. 에스.

이들 중 어느 것도 작동하지 않는다면 내부 메서드를 사용하고 문서화하는 것이 가장 바람직하다고 생각합니다. 어셈블리의 나머지 코드를 얼마나 많이 신뢰합니까?

+0

코드를 사용하는 유일한 사람이 아니기 때문에 코드를 신뢰하지 않습니다. . Foo는 UIElement이기 때문에 자연스럽게 다른 곳에서도 참조됩니다 (별도의 어셈블리 제외). –

+0

코드를 사용하는 유일한 사람이 아니더라도 반드시 코드를 불신 할 이유는 아닙니다. 동료가 문서화 된 "이 유형을 사용하지 마십시오"라는 경고를 정기적으로 무시합니까? 또한 Foo가 다른 곳에서 참조 되었기 때문에 Foo가 자체 어셈블리에있을 수 없다는 것을 의미하지는 않습니다 ... –

+0

나는 수업을 중첩했다. 나는 다른 부분을 조금 재구성했고 새로운 결과는 훌륭합니다. 감사! –

0

는 일반적으로 나는 다음과 같은 제안하십시오 :

public abstract class Foo:UIElement{ 
    //... 
} 

public class Bar:UIElement{ 
    //... 
    private class FooImpl:Foo 
    { 
     public int SomeMethod() 
     { 
      // do something 
     } 
    } 
} 

을하지만 우리는 UiElements의 처리하는 경우, 우리는 아마도 XAML와 함께 다루고있어? 이와 같은 클래스 구조는 XAML에서 Foo/FooImpl을 인스턴스화하는 것이 어렵습니다. 팩토리 패턴을 사용해야 할 수도 있기 때문에 ...