题
如果您有一个自定义集合类,它将单个类别的水果的权重单独存储在浮点数/双精度中,如下所示:
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类从来没有在任何地方使用过,只要写下来就可以指定那样的类型吗?
编辑:顺便说一下,这只是一个示例,而不是实际情况,但这反映了一个明确的方式。喜欢它的所有浮点/双打并传递给其他一些方法。但这些方法需要知道什么类型的水果才能正确执行。水果本身毫无意义。
解决方案
首先,枚举值不是类型,因此示例
FruitList<float, FruitType.Orange>
不起作用。如果您想确保将通用列表静态输入Orange
,则必须使用此
FruitList<float, Orange>
即使你永远不会使用<=>类。在我看来,可能没有必要,因为你可以在变量名中传达类型:
FruitList<float> orangeWeights = new FruitList<float>(FruitType.Orange);
其他提示
FruitList<float>(FruitType.Orange)
可能是要走的路。
float
不能是任何东西。
水果类型只是一个属性。为它创建一个单独的类型并使用类型参数是没有意义的。
取决于你的橘子是否会像一个......标签......就像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 { ... }