2010-07-29 3 views
0

기본 기능을 제공하기 위해 인터페이스에 대한 확장 메서드를 만드는 기술을 좋아합니다. 아주 편리한 장소 중 하나는 단위 테스트를 위해 더미 클래스에 고기를 넣는 것입니다.C# 인터페이스의 기본 속성 구현을 만들 수있는 방법이 있습니까

예를 들어

,

public interface IEmployee 
{ 
    IAddress Address { get; set; } 

    IAddress GetAddress(); 
    void SetAddress(IAddress address); 
} 

public class Employee : IEmployee 
{ 
    // Complex production stuff here (causes DB access) 
} 

public class TestEmployee : IEmployee 
{ 
    // Simple unit testing stuff goes here (in memory only) 
} 

public static class EmployeeExtensions 
{ 
    public static IAddress GetAddress(this IEmployee employee) 
    { 
     // Some sort of magic (maybe using IOC) 
     // 'employee' can be either of type 'Employee' or of type 'TestEmployee' 
    } 

    public static void SetAddress(this IEmployee employee, IAddress address) 
    { 
     // Again with the magic 
    } 
} 

좋아, 아마 좋은 예하지만 당신은 아이디어를 얻을 ...

열쇠는 getAddress에와 SetAddress이 코드없이 모두 직원 및 TestEmployee에 대해 호출 할 수 있다는 것입니다 그들 중 누구로부터 지원. 불행히도 이것은 C#보다 Java와 조금 비슷합니다. 두 가지 모두에 대해 정말로하고 싶은 것은 Address 속성을 직접 사용하여 메서드가 수행하는 것과 동일한 모든 마법을 수행하는 것입니다. 필자가 피하고자하는 것은 구체적 클래스에서 코드를 작성해야한다는 것입니다 (특히 TestEmployee에서).

IEmployee의 Address 속성에 대한 기본 구현을 제공하는 방법이 있습니까?

나는 C# 속성이 실제로 후드 아래의 메소드라는 것을 알고있다. 어떻게 든 구현을 제공하는 어쨌든?

다른 .NET 언어로도 처리 할 수 ​​있습니까?

+0

추상 기본 클래스를 사용하고 해당 수준에서 기본 구현을 제공 할 수 있습니다. – LukeH

+0

큰 제안 LukeH. 불행히도, 나는 이미 다른 클래스 (아마이 예제에서는 'Person')로부터 상속 받고있을 것입니다. 또한 각각 기본값이있는 여러 인터페이스를 상속 할 수 있습니다. C#은 하나의 클래스에서 상속을 허용합니다. – Justin

답변

0

이미 알기론 확장 메서드를 통해 속성을 추가 할 수 없습니다. 테스트를 쉽게하는 것이면 Moq과 같은 조롱 프레임 워크를 사용하여 인터페이스에서 상속 한 각 클래스에 해당 속성을 구현하지 않아도됩니다.

+0

감사합니다. Moq은 정말 좋았지 만 내가 원하는 바가 아니 었습니다. 단위 테스트는 이것이 유용 할 때의 간단한 (질문에 맞는) 예제 일뿐입니다. 속성은 실제로는 좋은 소비 구문을 가진 getter/setter 메서드입니다. 그걸 풀 수있는 방법이 있기를 바랬습니다. 이봐 요, 제 생각 엔 묻지 마세요. 내가 여기에 숨어있는 것보다 훨씬 더 큰 천재들이있다. – Justin

0

이렇게하는 방법에는 여러 가지가 있습니다. 제안 된 것처럼, 이러한 유형의 함수가 기본 클래스에 의해 처리되도록 계층 구조를 만들면됩니다.

그러나 Microsoft에서는 T4 Templates을 사용하는 코드 생성 솔루션에 관심이있을 수 있습니다.

+0

실키, 추상 클래스에 기본 구현을 추가 하시겠습니까? 나는 ** 인터페이스 **에서 그것을 할 수 있기를 원합니다. 질문에 LukeH에 대한 제 대답을보십시오. 내가 너를 오해하면 더 많은 정보가 있니? 나는 따라하지 않는다. 나는 T4를 잠시 알고 있었지만 실제로는 한번도 본 적이 없습니다. 너는 나에게 찔레를 줬다. 고맙습니다. PS. 요즘에는 MonoDevelop로 T4를 선적했다고합니다. – Justin

관련 문제