我有一个接口,ICheese,我希望能够根据需要进行扩展。它包含在实现IFruit接口的类中:
public interface IFruit<T> where T : ICheese
{
T : cheese { get; }
}
这样做是为了避免C#没有返回类型协方差的事实;我希望能够对IFruit进行任何实现,并且知道它内部有一些版本的ICheese。
IFruit与一些参与IFruit的ICrackers进行了会谈:
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 */ }
我无法将Apple传递给Rizt的Initialize()函数,即使Cheddar继承自ICheese。有没有办法让我能够实现这个目标或实现相同目标的模式?基本的想法是,我希望ICrackers能够说“我至少需要这个版本的ICheese”并且能够接受任何提供至少那个版本的ICheese的IFruit。
答案 0 :(得分:1)
您可以在IFruit
中提出T
协变:
public interface IFruit<out T> where T : ICheese
{
T Cheese { get; }
}