0

我有一个接口,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。

4

1 回答 1

1

您可以使IFruit协变T

public interface IFruit<out T> where T : ICheese
{
    T Cheese { get; }
}
于 2013-10-08T22:39:21.453 回答