필자는 필요에 따라 확장 할 수있는 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를 허용 할 수 있기를 바랍니다.
, 나는 "설정"을 사용할 수 없습니다. 이것을 없애는 방법이 있습니까? –
@TaylorHadden - Cheese 속성에 setter를 추가 할 수없고 안전하지 않으므로 'IFruit'의 공분산을 유지할 수 없습니다. 나는 당신의 예제가 간소화되어 있다고 가정하고,'Cracker.Initialize'의 구현을 보지 않고 무엇을 할 수 있는지 말할 수는 없습니다. –
Lee