2010-05-05 12 views
78

인터페이스에 확장 방법을 적용 할 수 있습니까? (인터페이스에 확장 방법을 적용 할 수 있습니까?

  1. 이 인터페이스 확장 방법하여 만드는 ITopology 인터페이스

  2. 를 만드는 등 공공 정적 INT CountNodes (이 ITopology topologyIf를 예를 들어 인 (C# 1 질문)

    는 다음 달성))

  3. 그러면 ITopology를 구현하는 클래스 (예 : MyGraph)를 만들면 자동으로 Count Nodes 확장이 생깁니다.

이렇게 인터페이스를 구현하는 클래스는 확장 메소드에 정의 된 것과 일치하도록 설정된 클래스 이름을 가질 필요가 없습니다.

답변

136

물론 가능합니다. 대부분의 Linq는 인터페이스 확장 메소드를 기반으로합니다.

인터페이스는 사실 확장 방법 개발의 원동력 중 하나였습니다. 그들은 자신의 기능을 구현할 수 없으므로 실제 코드를 인터페이스 정의와 연결하는 가장 쉬운 방법입니다.

IEnumerable<T> 주위에 구축 된 전체 확장 방법 모음에 대해서는 Enumerable 클래스를 참조하십시오. 이를 구현하는 것은 클래스에 하나를 구현하는 것과 같습니다 :

public static class TopologyExtensions 
{ 
    public static void CountNodes(this ITopology topology) 
    { 
     // ... 
    } 
} 

인터페이스에 관한 한 확장 메소드는 특별히 다릅니다. 확장 메서드는 메서드가 대상 형식의 일부인 것처럼 보이도록 컴파일러에서 일부 구문 설탕을 적용하는 정적 메서드입니다.

+9

Re : "당연히"- 내 생각에이 질문은 귀하가 암시 적으로 언급 한 아키텍처의 냄새를 드러내고 있다고 생각합니다. 인터페이스에서 확장 기능을 사용할 수 있다면 구현 된 메소드가 인터페이스에 포함되어있을 수없는 이유는 무엇입니까? 어느 한 인터페이스가 구체적인 방법을 가질 수 있어야한다고 생각하는 것은 이해할 만합니다. 그렇지 않다면 확장 메서드가 실행 가능한 kludge로 허용되어서는 안된다고 생각하면 이해할 수 있습니다. (그러나 그들은 훌륭합니다. "LINQ"가 아닌 "당연히"그리고 IEnum에 대한 링크 만 제공합니다. (https://github.com/dotnet/corefx/blob/master/src/System.Linq/ src/System/Linq/Contains.cs).;^D) 뭔가 냄새나요! – ruffin

관련 문제