2013-10-08 4 views
0

필자는 필요에 따라 확장 할 수있는 ICheese 인터페이스가 있습니다. 그것은이 IFruit 인터페이스를 구현한다 클래스가 포함되어 있습니다 :C# 일반 유형 상속

public interface IFruit<T> where T : ICheese 
{ 
    T : cheese { get; } 
} 

이 회피 C 번호는 반환 형식 공분산이 없다는 사실에 이루어졌다; 나는 IFruit을 구현할 수 있기를 원하며, 그 안에 ICheese 버전이 있음을 알고 있습니다. IFruit에 대한 참조가 ICrackers의 수에

IFruit 회담이 너무 오래 ICracker의 구현은 특별히 정의로 작동

public interface ICracker<T> where T : ICheese 
{ 
    void Initialize(IFruit<T> fruit); 
} 

public abstract class Cracker<T> where T : ICheese 
{ 
    IFruit<T> fruit   

    public void Initialize(IFruit<T> fruit) 
    { 
     this.fruit = fruit; 
    } 
} 

는 ICheese의 종류는 사용하는 것입니다 :

public class Apple : IFruit<Cheddar> {/* Implementation of Class */} 

public class Saltine : Cracker<Cheddar> {/* Implementation of Class */} 

그 경우, Saltine 인스턴스에서 Initialize (new Apple())를 호출하면됩니다. 우리는이 같은 ICracker이있는 경우

그러나 :

public class Ritz : Cracker<ICheese> { /* Implementation of Class */ } 

나는 체더 치즈가 ICheese에서 상속에도 불구하고,() 함수 Rizt의 초기화에 애플을 전달할 수 없습니다. 내가 이것을 작동 시키거나 같은 목표를 성취 할 수있는 방법이 있을까요? 기본 아이디어는 ICrackers가 "적어도이 ICheese 버전이 필요합니다"라고 말하면서 적어도 ICheese 버전을 제공하는 모든 종류의 IFruit를 허용 할 수 있기를 바랍니다.

답변

1

당신은 TIFruit 공변을 할 수 있습니다 :이 작업을 수행 할 때

public interface IFruit<out T> where T : ICheese 
{ 
    T Cheese { get; } 
} 
+0

, 나는 "설정"을 사용할 수 없습니다. 이것을 없애는 방법이 있습니까? –

+0

@TaylorHadden - Cheese 속성에 setter를 추가 할 수없고 안전하지 않으므로 'IFruit'의 공분산을 유지할 수 없습니다. 나는 당신의 예제가 간소화되어 있다고 가정하고,'Cracker .Initialize'의 구현을 보지 않고 무엇을 할 수 있는지 말할 수는 없습니다. – Lee