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