2012-12-20 91 views
2

我還沒有找到我的用例在現有的問題,所以我在這裏。 我有了泛型這樣一個抽象類:抽象的泛型和摘要列表

public abstract class aParameter<T> 
{ 
    private T _parameter; 

    public T Parameter 
    { 
     get { return _parameter;} 
    } 

    ... 
} 

然後,我有我的「類型」類像這樣:

public class IntParameter : aParameter<Int32> 
{ 
    public IntParameter(Int32 value) 
    { 
     _parameter = value; 
    } 
} 

public class TextParameter : aParameter<String> 
{ 
    public TextParameter(String value) 
    { 
     _parameter = value; 
    } 
} 

現在在我的應用程序代碼中,我想創建一個字典與抽象泛型類沒有指定泛型類型。就像這樣:

... 
private Dictionary<Int32, aParameter> _paramDict = new Dictionary<Int32, aParameter>(); 
... 

在以前的版本中,我使用的接口,而不是抽象類aParameter但我想將其遷移到抽象,這樣我可以簡化我的「類型」類,而不是重複相同的代碼爲每個「類型」。

這裏有什麼想法嗎?

編輯

我忘了提,這將是是指公司之間分配,所以我真的需要,以確保允許的類型庫的一部分。我不能讓objects進入我的代碼。

回答

5

您可能仍然需要非泛型接口(或非Brandon所說的非泛型抽象基類),除非您放棄使用對象。

的原因是,aParameter<String>是不一樣的類型aParameter<int32>所以你不能讓他們進入一個字典沒有一些幫助。

我的首選方法是聲明一個非泛型接口並將其用作字典的基礎,然後在每個類型化的泛型中以及抽象基類中實現它。這樣,您可以儘可能從基類繼承,或者如果您的類型之一需要從其他類繼承,那麼只需實現接口 - 您將獲得最大的靈活性。

+0

接口方法看起來像我的選擇。我仍然遇到了一個問題,因爲我需要接口提供的'public T Parameter'。我試着把它作爲'公共對象參數',但不能覆蓋輸出類型。我去看看,如果我可以用'object'輸出 –

+0

走這條路好做它用'object'返回類型爲我的'Parameter'屬性和結果都很好。現在完成清理代碼... –

+0

您可以使用參數返回類型的接口返回對象,但在泛型中仍然具有更強的類型。 –

4

製作一個非通用的抽象基類,讓您的通用抽象類繼承它。

+0

不錯,但我更喜歡Jon的'interface'方法。 –

+0

是的,喬恩給了你兩全其美的:) –

0

泛型類型的目的是(除其他外),您只能編寫一次代碼,可用於多種類型。但是,由於C#是強類型的,編譯器需要知道它在泛型類中處理的是什麼類型。這就是爲什麼你必須指定通用類型(即角括號中的類型) 如果你沒有指定通用類型,那麼在你的例子中,編譯器不會知道Parameter屬性的類型。

取決於你用它做什麼,有一些可能的方法:

  1. 使用Dictionary<int, object>。 讀取值時,可以使用一堆if/elses來檢查對象的特定類型並將其轉換爲適當的類型。例如

    如果(obj.GetType()== typeof運算(TextParameter)){ TextParameter P = OBJ時TextParameter //做的東西 } 否則如果obj。的GetType()== typeof運算(IntParameter)){ IntParameter P = OBJ時IntParameter //做的東西 }

  2. 有多個詞典。 Dictionary<int, TextParameter>Dictionary<int, IntParameter>

  3. 如果有方法/在aParameter性質不是類型依賴然後將它們移動到一個較低的水平非通用抽象類。這可以爲您提供至少一些功能,而無需訴諸類型轉換。

+0

我不能爲你的選擇1作爲'對象'過於通用,我不想要if/else垃圾。你的選項2是不可能的,因爲我不知道什麼是饋送到我的代碼。你的選擇3可能是最好的選擇,我不得不弄清楚,但是我厭倦了像地獄一樣的投射。 –