2013-10-08 232 views
0

我有一个接口ICheese,我希望能够根据需要进行扩展。它是由正在实施IFruit接口类包含:C#泛型类型继承

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

这样做是为了躲避的事实,C#没有返回类型的协方差;我希望能够实现IFruit的任何实现,并且知道它里面有一些ICheese版本。

IFruit会谈到一些ICrackers的,谁也IFruit参考:

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; 
    } 
} 

这工作,只要ICracker执行情况,特别定义了一种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 */ } 

我不能通过苹果进入Rizt的初始化()函数,即使从切达继承ICheese。有没有一种方法可以让我们实现这个目标?或者一种能够实现相同目标的模式?基本思想是我希望ICrackers能够说“我至少需要这个版本的ICheese”,并且能够接受任何提供至少该版本ICheese的IFruit。

回答

1

您可以IFruit协在T

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

当我这样做,我不能使用 “设置”。有什么办法可以解决这个问题吗? –

+0

@TaylorHadden - 你不能添加一个setter到'Cheese'属性并保留'IFruit'的协方差,因为它不安全。我假设你的例子被简化了,所以很难说如果没有看到'Cracker .Initialize'的实现,你还能做什么。 – Lee