2010-05-12 49 views
0

我正在試圖製作一個泛型類,需要3種類型,一個簡單字符串,IList<string>IList<OntologyStore>如何創建需要3種類型的泛型類

public class OntologyStore 
{ 
} 

public sealed class jim<T> where T:new() 
{ 
    string J; 
    IList<string> X = null; 
    IList<OntologyStore> X1 = null; 

    public jim() 
    { 
     if (typeof(T) == typeof(String)) 
     { 
      J = string.Empty; 
     } 
     if (typeof(T) == typeof(OntologyStore)) 
     { 
      X1 = new List<OntologyStore>(); 
     } 
     if (typeof(T)==typeof(IList)) 
     { 
      X = new List<string>(); 
     } 
    } 
} 

我可以輕鬆地創建,你預期的那樣工作,

jim<OntologyStore> x1=new jim<jim<OntologyStore>() 

你所期望的,但是當我把在

jim<string> x2=new jim<string>() 

編譯器報告的字符串是不可abtract類型,這是你所期望的。

是否有可能創建一個泛型類,它可以實例化爲一個持有字符串的類,或者一個IList<string>IList<OntologyStore>

+0

你真的設法混淆了我!你想解決什麼問題? – flq 2010-05-12 20:37:20

+0

如果您將類命名爲專有名稱以外的名稱,它可以更容易地回答您的問題。它引起混淆,指的是名爲'jim'或'bob'的類。 – LBushkin 2010-05-12 20:40:33

+0

忽略我的帖子,你在我寫答案的時候更新了這個問題。 我不確定我是否明白你實際上想要用這堂課做什麼。對於它的目的我有點困惑。 – Toby 2010-05-12 20:40:48

回答

0

你不能直接用泛型來做到這一點。通用約束必須指定一個對所有實現都是約束的單一類型......在你的情況下,沒有共同的基類System.String,IList<String>IList<OntologyStore>這是一個唯一的基類或接口這些類型(因爲System.ObjectIEnumerable是唯一的通用基礎類型,我相信...)

但是,我會建議重新考慮你的設計,以避免泛型,在這種情況下。

一個選項,以防止重複的功能是使一個基類,並有3種工廠方法,其結構和問題返回一個子類的特定類型:

public class Jim 
{ 
    protected Jim() {} 

    public Jim Create(string value) 
    { 
     return new StringJim(value); 
    } 

    private class StringJim : Jim 
    { 
     public StringJim(string value) { // ... 
     } 
    } 
    // Do same for IList<string> and IList<OntologyStore>.. 

    // Add common methods here... 
} 
1

這是你不應該試圖創建這樣一個類,但有一個接口(或一個抽象基礎),並從中派生出三個不同的具體類的情況下的定義。

1

我認爲你的問題必須做事實上String類不具有「new()」約束所需的公共無參數構造函數。

0

如果你正在編寫一個泛型類,並且你正在基於T的類型進行操作,那麼這通常表明這對泛型沒有好處,或者你沒有正確構建類。

在這種情況下,它看起來像這樣更適合使用接口給這些類提供共享類型。如果他們最終共享某種實現,那麼使用基類而不是接口。