C#通用类型继承

时间:2013-10-08 22:25:11

标签: c# generics inheritance covariance

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

1 个答案:

答案 0 :(得分:1)

您可以在IFruit中提出T协变:

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