인터페이스에 확장 메서드를 적용 할 수 있습니까?


123

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

예를 들어 다음을 달성하는 것입니다.

  1. ITopology 인터페이스 생성

  2. 이 인터페이스에 대한 확장 메서드를 만듭니다 (예 : public static int CountNodes (this ITopology topologyIf))

  3. 그런 다음 ITopology를 구현하는 클래스 (예 : MyGraph)를 만들 때 자동으로 Count Nodes 확장을 갖게됩니다.

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

답변:


188

물론 가능합니다. 대부분의 Linq는 인터페이스 확장 메서드를 중심으로 구축됩니다.

인터페이스는 실제로 확장 방법 개발의 원동력 중 하나였습니다. 자체 기능을 구현할 수 없기 때문에 확장 메서드는 실제 코드를 인터페이스 정의와 연결하는 가장 쉬운 방법입니다.

.NET을 기반으로 구축 된 전체 확장 메서드 컬렉션은 Enumerable 클래스를 참조하세요 IEnumerable<T>. 하나를 구현하려면 클래스에 대해 하나를 구현하는 것과 같습니다.

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

인터페이스에 관한 한 확장 메소드에 대해 특별히 다른 것은 없습니다. 확장 메서드는 컴파일러가 일부 구문 설탕을 적용하여 메서드가 대상 유형의 일부인 것처럼 보이게하는 정적 메서드입니다.


33
Re : "물론"-이 질문은 당신이 암묵적으로 언급 한 건축 냄새를 드러낸다 고 생각합니다. 인터페이스에 확장 기능을 사용할 수 있다면 인터페이스에 구현 된 메서드가 포함될 수없는 이유는 무엇입니까? 인터페이스가 구체적인 메소드를 가질 수 있어야한다고 생각하거나, 불가능하다는 것을 알게되면 확장 메소드가 실행 가능한 클러 지로 허용되어서는 안된다고 생각하는 것은 이해할 수 있습니다. (그러나 그들은 그렇습니다. 귀하의 훌륭한 대답을 주장하는 것이 아니라 "물론"과 LINQ가 아닌 IEnum에 대한 링크 입니다.; ^ D) 뭔가 냄새가납니다!
ruffin

이제 기본 구현을 C # 인터페이스 메서드에 추가 할 수 있다는 소식을 @ruffin 주석에 추가하고 싶습니다. 출처 : devblogs.microsoft.com/dotnet/…
Vinigas

@ruffin 나는 이것이 C #에서 가장 혼란스러운 아키텍처 결정임을 발견했습니다. 때로는 절반 수준의 절반 인터페이스 구조가 모든 것을 엉망으로 만듭니다. 그래도 함수형 프로그래밍 관점에서 접근 할 때 유용 할 수 있고 기능을 구현하는 대신 인터페이스에 유틸리티를 도입하는 데 사용할 수 있다고 생각합니다.
Guney Ozsan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.