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。
当我这样做,我不能使用 “设置”。有什么办法可以解决这个问题吗? –
@TaylorHadden - 你不能添加一个setter到'Cheese'属性并保留'IFruit'的协方差,因为它不安全。我假设你的例子被简化了,所以很难说如果没有看到'Cracker .Initialize'的实现,你还能做什么。 –
Lee