2014-07-16 4 views
1

왜이 작업을 수행 할 수 있습니까?필요한 반환 형식을 구현하는 반환 형식의 인터페이스 구현

IHasOperatingSystem { 
IOperatingSystem OperatingSystem { get; } 
} 

Computer<T> : IHasOperatingSystem where T : IOperatingSystem { 
public T OperatingSystem { get; } 
} 

유형 IOperatingSystem해야한다고 말해,하지만 T는 IOperatingSystem를 구현하는 경우, 즉 충분하지 않겠습니까?

또한이 질문의 제목은 다소 혼란 스러울 수 있지만 더 나은 표현 방법은 생각할 수 없습니다.

답변

6

유형이 IOperatingSystem이어야한다고하지만, T가 IOperatingSystem을 구현하는 경우 충분하지 않아야합니까?

아니요. C#이 작동하는 방식이 아닙니다. 인터페이스를 구현하거나 메서드를 재정의하려면 과 정확하게 일치해야합니다 (). 는 C# 5 명세의 섹션 13.4.4에서 : 인터페이스 매핑 목적

, 반원 A는 인터페이스 멤버 B 일치 :

  • A 및 B는 방법 및 이름을 A와 B의 형식 매개 변수 목록은 동일합니다.

이제

(. 여기에 "유형", "반환 형식"으로 읽어야한다)

  • ... 당신은 물론, IHasOperatingSystem 유형은 일반적인 만들 수 :

    public interface IHasOperatingSystem<T> where T : IOperatingSystem 
    { 
        T OperatingSystem { get; } 
    } 
    
    public class Computer<T> : IHasOperatingSystem<T> where T : IOperatingSystem 
    { 
        public T OperatingSystem { get { ... } } 
    } 
    

    또는 Computer<T> 클래스의 명시 적 인터페이스 구현을 사용할 수 있습니다.

    public interface IHasOperatingSystem 
    { 
        IOperatingSystem OperatingSystem { get; } 
    } 
    
    public class Computer<T> : IHasOperatingSystem where T : IOperatingSystem 
    { 
        // Explicit interface implementation... 
        IHasOperatingSystem.OperatingSystem IOperatingSystem 
        { 
         // Delegate to the public property 
         get { return OperatingSystem; } 
        } 
    
        public T OperatingSystem { get { ... } }; 
    } 
    
  • +0

    감사합니다. 나는 두 번째 방법을 좋아한다. IHasOperatingSystem 인터페이스는 꽤 광범위하게 사용되기 때문에 일반화하는 것이 내가 원하는 것보다 좀 더 침해적일 수 있습니다. 나는 아직도 이것에 조금 퍼지다. 이 문제를 허용 할 수 있습니까 (즉, 절대 허용되지 않음), 현재 사물이 어떻게 설계되어 있는지에 대해서는 허용되지 않습니까? – Eric

    2

    T가 IOperatingSystem을 구현하는 경우 충분하지 않아야합니까?

    다른 언어 (스칼라, 제 생각 엔)로 충분할 수도 있지만 C#에서는 충분하지 않습니다. 반환 형식은 invariant입니다 (대리자 반환 형식은 which are covariant 제외). 이러한 상황에 대한

    일반적인 해결 방법은 같은 제네릭을 사용하는 것입니다

    IHasOperatingSystem<T> where T: IOperatingSystem 
    { 
        T OperatingSystem { get; } 
    } 
    
    Computer<T> : IHasOperatingSystem <T> where T : IOperatingSystem 
    { 
        public T OperatingSystem { get; } 
    } 
    
    관련 문제