泛型问题(类型参数与构造函数)

时间:2009-03-02 17:35:42

标签: c# .net generics class

如果您有一个自定义集合类,它将单个类别的水果的权重单独存储在浮点数/双精度中,如下所示:

1.1, 3.3, 6.6, 4.4, ...

并且您需要指定它是浮点数还是双精度并区分水果类型,最好这样做:

使用枚举:

FruitList<float, FruitType.Orange>

在构造函数中使用枚举:

FruitList<float> (FruitType.Orange)

使用课程:

FruitList<float, Orange>

在构造函数中使用类:

FruitList<float> (Orange)

令我困惑的是,在&lt;&gt;中指定这些类型的东西是否有意义。区域(不知道该区域叫什么)?

哪种更好,更快,更有效?

顺便说一句,Orange类从来没有在任何地方使用过,只要写下来就可以指定那样的类型吗?

编辑:顺便说一下,这只是一个示例,而不是实际情况,但这反映了一个明确的方式。喜欢它的所有浮点/双打并传递给其他一些方法。但这些方法需要知道什么类型的水果才能正确执行。水果本身毫无意义。

3 个答案:

答案 0 :(得分:1)

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

float除了类型参数外不能是任何东西。 水果类型只是一个属性。为它创建一个单独的类型并使用类型参数是没有意义的。

答案 1 :(得分:1)

首先,枚举值不是类型,因此示例

FruitList<float, FruitType.Orange>

不起作用。如果您想确保将通用列表静态输入Orange,则必须使用此列表

FruitList<float, Orange>

即使您永远不会使用Orange课程。在我看来,可能没有必要,因为你可以在变量名中传达类型:

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

答案 2 :(得分:0)

取决于你的橘子是否会像一个......标签......就像Color一样。汽车可以是蓝色和红色,仍然是“相同”的汽车。如果你想让Orange能够做一些与普通水果或苹果不同的东西,我会创建一个抽象的Fruit类和一个子类Orange,然后使用&lt;&gt;事情。如果只是一个标签的东西,比如颜色,那么枚举可以做得很好我猜。

我认为通过使用类/结构进行类型检查更容易。比如,如果有人试图在你的水果清单中添加苹果类水果,会发生什么?它会变成橙色吗?是否需要检查水果的果实类型是否为橙色?如果不是会发生什么?的ArgumentException?

我想我会去上课和&lt;&gt;啄。但那就是我。实际上,如果是我,我想我会继续前进并使用decimal来衡量体重以及其他需要测量的东西......然后就会有类似的东西(完全错误的语法等,但你得到了希望这个想法):

class FruitList<TFruit> where TFruit : Fruit {}

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

class Orange : Fruit { ... }