我有一个接口,ICheese,我希望能够根据需要进行扩展。它包含在实现 IFruit 接口的类中:
public interface IFruit<T> where T : ICheese
{
T : cheese { get; }
}
这样做是为了避免 C# 没有返回类型协方差的事实。我希望能够有任何 IFruit 的实现,并且知道它里面有一些 IChese 版本。
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。