2009-03-02 24 views
-1

如果你有存儲的單一類水果中的權重分別在彩車/雙,像這樣一個自定義集合類:泛型的問題(型號參數VS構造)

1.1, 3.3, 6.6, 4.4, ... 

,你需要指定無論是浮動或雙,並區分果型,是它更好地做到這一點是這樣的:

使用枚舉:

FruitList<float, FruitType.Orange> 

使用在構造一個枚舉:

FruitList<float> (FruitType.Orange) 

使用類:

FruitList<float, Orange> 

使用在構造一個類:

FruitList<float> (Orange) 

讓我困惑的事情是,在<>區域中指定這些東西是否有意義(不知道該區域稱爲什麼)?

哪種更好,更快,更高效的做法?

順便說一句Orange類從來沒有在任何地方使用,只是寫了它,如果這是有道理的,指定類型那樣?

編輯:順便說一句,這只是一個例子,而不是實際的例子,但這反映在一個明確的方式。就像它是所有浮動/雙打,並傳遞給其他一些方法。但是這些方法需要知道要正確執行哪種水果。水果本身毫無意義。

回答

1

首先,枚舉值不是類型,所以例如

FruitList<float, FruitType.Orange> 

將無法​​正常工作。如果你想確保你的泛型列表被staticly輸入到Orange你將不得不使用這一個

FruitList<float, Orange> 

即使你將永遠不會使用Orange類。在我看來,有可能是沒有必要的,因爲你可以在變量名輸送型:

FruitList<float> orangeWeights = new FruitList<float>(FruitType.Orange); 
1

FruitList<float>(FruitType.Orange)可能是要走的路。

float不能是除了類型參數以外的任何東西。 水果類型只是一個屬性。創建一個單獨的類型併爲其使用類型參數是沒有意義的。

0

取決於如果你的那個橙色的只是要像...標記...像Color。一輛車可以是藍色和紅色,仍然是「一樣的」車。如果你想讓Orange能夠做一些特別的事情,比普通的水果或蘋果更有意思,我會創建一個抽象的Fruit類和一個子類Orange,然後使用這個東西。如果只是一個標籤的東西,就像一個顏色,那麼枚舉可以做得很好,我猜。

我認爲通過使用類/結構體來進行類型檢查比較容易。比如,如果有人試圖將一些蘋果水果添加到你的水果中,會發生什麼?它會變成橙色嗎?是否需要檢查果實的水果類型是否是橙色的?如果不是,會發生什麼? ArgumentException的?

我想我會去上課和<> thingy。但那就是我。實際上,如果是我,我想我會繼續前進,並使用decimal來衡量體重和其他需要衡量的東西......然後有類似的東西(完全錯誤的語法等,但你希望得到這個想法):

class FruitList<TFruit> where TFruit : Fruit {} 

abstract class Fruit {public abstract decimal Weight {get; protected set; }} 

class Orange : Fruit { ... } 
+0

嗯,這是怎麼發生的雙重職位? – Svish 2009-03-02 17:55:07