2015-05-26 111 views
-1

我有一個用C#編寫的應用程序。我的應用有一個如下所示的類:在C#中使用泛型接口#

public class FinderA 
{ 
    public IEnumerable<FinderA> GetItems() 
    { 
    return FinderA.FindAll(); 
    } 
} 

我想要求其他類做類似的事情。我不能使用基類,因爲我的實際實現已經在使用基類。出於這個原因,我想創建一個接口。目前,我嘗試以下:

public interface IFinder 
{ 
    IEnumerable<T> GetItems(); 
} 

當我使用這種方法,我得到的是說,一個編譯時錯誤:「類型或命名空間名稱‘T’找不到(是否缺少。 ..「爲了克服這個問題,我想補充<T>到接口名稱的末尾,以便它看起來像這樣:

public interface IFinder<T> 
{ 
    IEnumerable<T> GetItems(); 
} 

這反過來又產生另一種說,編譯時錯誤:」使用泛型類型「IFinder '需要1個類型參數'「我的挑戰是,我希望接口是通用的,我不想傳入一個類型,有沒有辦法解決這個問題呢?如果是這樣,什麼/如何?

+1

請求沒有任何意義......你不想傳入一個類型,但你希望接口是通用的。如果你的界面是通用的,那意味着你必須傳入一個類型。 –

+1

@TimothyShields他希望推斷它;具體而言,他希望泛型參數始終是實現接口的類型。至少,這就是它的樣子。當然,C#中沒有這樣的功能。 – Servy

+0

一個猜測,根據你如何定義FinderA:'public interface IFinder {IEnumerable GetItems(); }' – ASh

回答

0

有沒有辦法解決這個問題;在聲明類實現接口時,您需要實際提供泛型類型參數。

+0

其實,上面ASh的評論解決了我的問題。 –

+0

@JQueryMobile那麼,這不是你實際詢問的問題。你問過你是否需要爲泛型接口提供泛型參數。如果您描述了您所遇到的實際問題,我們可以幫助您解決該問題,但實際上並未在您的問題中這樣做。 – Servy

+0

一個人似乎明白這一點。 –

0

如果你希望你的接口是通用的,但你不願意提供一個類型參數,你可以返回一個IEnumerable<object>

public interface IFinder { 
    IEnumerable<object> GetItems(); 
} 

所有類類型從System.Object延伸,從而應該能滿足任何類型的applicacion(枚舉結構會得到盒裝)

請注意,這種方法需要對界面的消費者投通用的object實例到適當的類型。

備用(推薦)的方法是使界面使用類型參數,但你必須在方法層面,而不是作爲一個提供此時,相應的類型參數

+0

像'enum'和'struct's這樣的值類型只會被裝箱。 – juharr

+0

這打破了泛型的全部目的。而且,值類型*可以被返回,它們只會被裝箱。 – haim770

+0

你們是對的。更新我的答案。 –

0

你可以這樣做接口本身的泛型類型。然後

public interface IFinder 
{ 
    IEnumerable<T> GetItems<T>(); 
} 

你的代碼可以調用它像這樣:

IFinder finder = // Create finder instance 
IEnumerable<MyClass> discoveredClasses = finder.GetItems<MyClass>(); 

如果你想確保MyClass是實現IFinder一類,你可以限制的方法。

public interface IFinder 
{ 
    IEnumerable<T> GetItems<T>() where T : IFinder; 
} 

這將導致以下生成編譯器錯誤:

public class Foo 
{ 
} 

public class Bar 
{ 
    Bar() 
    { 
     IFinder finder = // Create finder. 
     // This fails because <T> (Foo) does not implement IFinder. 
     IEnumerable<Foo> fooItems = finder.GetItems<Foo>(); 
    } 
} 

,但它將使以下編譯

public class MyFinderA : IFinder 
{ 
    IEnumerable<T> GetItems<T>() where T : IFinder 
    { 
     return // Create collection of T 
} 

public class Bar 
{ 
    Bar() 
    { 
     IFinder finder = // Create finder. 
     // This works as <T> (MyFinderA) is an IFinder implementation 
     IEnumerable<MyFinderA> finderItems = finder.GetItems<MyFinderA>(); 
    } 
} 
+0

但是他所擁有的方法應該滿足這個契約*不會在返回類型中有所不同,所以該方法在概念上不是通用的,而是接口本身。 – Servy

+0

他需要向我們展示一個更好的例子。聽起來像這樣可以通過在接口上添加一個間接級別來解決,如果他想具體定義對象,然後一般地獲取它們;我不明白_how_ GetItems在他的示例代碼中用於實踐。 –