2009-05-24 11 views
5

나는 다음과 같은 모델 패턴이 : 위의 과정 이상의 자식 (손자) 클래스가있을 것입니다하지만 난 단지 그들 중 하나를 넣어 같은C#에서 확장 메서드를 오버로드하는 방법이 있습니까?

public abstract class PARENTCLASS {...} 
public class CHILD_A_CLASS : PARENTCLASS{...} 
public static class EXTENSION{ 
    public static METHOD(this PARENTCLASS parent){...} 
    public static METHOD(this CHILD_A_CLASS child) {...} 
} 

뭔가.

PARENTCLASS cc = new CHILD_A_CLASS(); 
cc.METHOD(); 

그것은 부모 확장 메서드 대신 내 예상 아동 확장 메서드를 실행합니다 : 나는 다음과 같은 확장 메서드를 호출 할 때 문제이다. 누구든지 이것을 구현하는 방법에 대한 아이디어가 있습니까? (메소드 자체를 클래스에 넣는 것을 고려하지 않고 모델 클래스를 다른 로직과 멀리 떨어져 있고 싶기 때문에 상속을 수행합니다).

답변

5

오버로드 확장 메서드가 가능합니다. 귀하의 코드는 그렇게하는 방법의 예입니다.

그래도 원하는 것은 확장 메서드를 재정 의하여 개체의 런타임 유형이 확장 메서드 호출을 결정하는 것입니다. 한 클래스에 가상 메소드를 정의하는 것과 비슷합니다. 이러한 기능에 대한 특정 언어 구문 지원은 없습니다.

이것이 정말로 중요하다면이 기능을 구현할 수 있습니다. 그것은 약간의 무차별 한 힘이 필요하지만 일을 끝내게됩니다. 예를 들어 ...

+0

감사합니다. 나는 타입 캐스팅이 실행하기에는 너무 비싸고 이와 같이 코드를 유지하는 것은 매우 어색하다고 생각한다. 나는 이것을 구현하기위한 대체 방법을 찾을 것이라고 생각한다. – xandy

+1

타입 캐스팅은 꽤 빠르지 만 유지 관리가 지저분 할 수 있습니다. –

+0

제안서가 다형성이 아니므로 선택한 메소드는 런타임 참조 유형이 아닌 컴파일 참조 유형에서만 정확합니다. 간단히 말해서 너무 우선 적용되지는 않습니다. 항상 작동하지 않고 불일치로 이어지고 잘못 보이고 더 많은 문제를 야기하므로 나쁜 습관이라고 생각합니다. 나는이 메소드들이 동적으로 전달되지 않는다는 사실을 숨기면서 확장 메소드가 잘못되었다고 생각한다. –

1

불행히도 나는 당신이 원하는 것을 얻을 수 없을 것이라고 생각합니다. 확장 메서드는 정적이며 정적 메서드는 가상 일 수 없습니다.

JaredPar의 솔루션과 같은 방법으로 해결할 수 있습니다.

모델을 구현과 구분하는 것이 목표 인 경우 브릿지 패턴 (GOF)을 살펴 보시기 바랍니다. "구현과 추상화 분리"이것은 우려를 분리하고 모델 클래스를보다 명확하게 유지하는 데 도움이 될 수 있습니다.

관련 문제