2013-10-08 73 views
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。

回答

1

您可以IFruit協在T

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

當我這樣做,我不能使用 「設置」。有什麼辦法可以解決這個問題嗎? –

+0

@TaylorHadden - 你不能添加一個setter到'Cheese'屬性並保留'IFruit'的協方差,因爲它不安全。我假設你的例子被簡化了,所以很難說如果沒有看到'Cracker .Initialize'的實現,你還能做什麼。 – Lee