2012-12-18 3 views
2

파생 클래스와 기본 형식 모두에 대해 확장 메서드가 나타나지 않도록하고 기본 형식으로 만 확장 메서드를 제한하는 방법이 있습니까?기본 클래스에 확장 메서드 제한

내 상황은 약간 특별한 경우이지만 긴 이야기로 요약하면 기본 엔터티에서 파생 된 엔터티로 캐스팅하는 것이 안전하며 파생 된 엔터티 목록에서 기본 개체 목록 또는 그 반대로 이러한 캐스트는 일반적으로 안전하지 않으므로 캐스트를 수행 할 확장 메서드를 제공하므로 라이브러리를 사용하는 개발자는 어떤 캐스트가 안전하고 어떤 캐스트가 안전하지 않은지 기억할 필요가 없습니다.

ToDerivedEntity 확장 방법은 BaseEntity 관련하여 구현하고,이 DerivedEntity에 ToDerivedEntity를 호출하는 것을 다치게하지 않습니다 동안 내가 DerivedEntity에 나타나지 ToDerivedEntity을 방지 할 수 있다면, 그것은, 유용성의 관점에서, 좋은 것 BaseEntity로만 제한하십시오.

public class BaseEntity 
{ 
} 

public class DerivedEntity : BaseEntity 
{ 
} 

static class ExtensionMethods 
{ 
    // Should only show up on BaseEntity. 
    public static ToDerivedEntity(this BaseEntity source) 
    { 
     return (DerivedEntity)source; 
    } 
} 
+0

당신의 목표가 어떤 상속이 일어나기 위해 고안된 것이 아니라면 그 접근법에 잘못된 것이 있어야합니다. – ken2k

+0

@ ken2k - 앞에서 언급했듯이 파생 된 객체에 메서드가 있으면 코드가 제대로 작동하지만 일반적으로 안전하지 않은 캐스트를 수행하는 것이므로 캐스트가 효과적 일 때 캐스트가 의미가 없습니다. 자신에게. 내 생각 엔 그것을 막을 수있는 방법이 없다는 것입니다. 그러나 Extension 메소드는 일반적인 객체 디자인과는 조금 다르기 때문에 내가 찾고있는 것을 제거 할 수있는 방법이 있는지 확실하지 않았습니다. 그것은 사용의 편의를위한 것입니다. –

+0

이 방법을 사용하는 이유는 무엇입니까? 'source.ToDerivedEntity()'가'(DerviedEntity) source'를 쓰는 것보다 나은 이유는 무엇입니까? – juharr

답변

6

아니요. 그렇게 할 수 없습니다. 확장 메소드는 파생 된 유형의 수신기에 적용됩니다. 당신이 할 수있는 최선의 방법은 객체의 런타임 타입을 기반으로 동적으로 그런 것들을 시행하는 것이다. 예외를 throw합니다. 그러나이 경우에는 적절하지 않습니다. 파생 된 유형의 오브젝트에서 메소드를 호출 가능하게하려고합니다.

더 중요한 것은 API 디자인 관점에서 사용자가 원하는 것은 아닙니다. "ToString()"을 고려하십시오. String에도 존재합니다.

+0

감사합니다. 듣고 싶지 않았지만, 듣고 싶었던 것입니다. 내가 뭔가 확실한 것을 놓치지 않았는지 확인하기 위해 여기에서 수사를하고 싶었습니다. –