作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在实现代表距离(或长度)的值类型。有一个枚举代表不同的度量单位,例如:
public enum DistanceUnit
{
Millimeter,
Centimeter,
Meter,
Kilometer,
Inch,
Foot,
Yard,
Mile
};
这些度量属于两个系统之一 - 公制或英制。由于枚举不支持层次结构,表示此层次结构的最佳模式是什么?
是使用位标志吗?或者使用两个单独的枚举以及一些方法来关联它们?或者声明静态成员而不是枚举?
给我一些建议...您将如何实现?
编辑 - 更多说明:我有几个不可变结构(由 T4 生成),它们代表各种测量值:
public struct Meters : IEquatable<Distance>,
IEquatable<Meters>,
IEquatable<Millimeters>, ... IComparable<> etc.. etc..
{
public readonly decimal Value;
...
public static implicit operator Distance (Meters other) {
// Can implicitly cast to Distance
}
}
public struct Millimeters ...
public struct Centimeters ....
...等等,以及一个手工编码的不可变距离,旨在表示任何度量:
public struct Distance : IEquatable<Distance>,
IEquatable<Meters>,
IEquatable<Millimeters>, ...
IFormattable
{
public readonly decimal Value;
public readonly DistanceUnits UnitOfMeasure;
...
public string ToString(string format, IFormatProvider provider)
{
// Logic:
// If UOM = Meters and Value < .1 then display as "10 cm" instead of ".1 M"
// If UOM = Inches and value multiple of 12, display as feet
// etc, etc
}
}
前面讨论了是否应通过调用代码将距离转换为正确的 UOM,此处的目标是让 ToString 在当前 UnitOfMeasure 表示的相同测量值(英制或公制)上向上或向下转换值.
显然,这都可以硬编码到 ToString 方法中,但考虑到我还在为整个 shibang 实现 TypeConverters 和 FormatProviders,我想找到一种通用方法来从 DistanceUnit 中找出什么适当的下一个或下一个下一个度量单位将是。
我想以这种方式实现是不是找错了地方?
最佳答案
你真的需要一个 enum
吗?也许,一个简单的 value object会怎样?
public class Distance
{
private readonly decimal millimeters;
public decimal Meters
{
get { return millimeters * 0.001m; }
}
private Distance(decimal millimeters)
{
this.millimeters = millimeters;
}
public static Distance Yards(decimal yards)
{
return new Distance(yards * 914.4m);
}
}
通过扩展方法,您和正确定义的运算符可以获得非常类似于 Ruby 的语法:
var theWholeNineYards = 9.Yards() + 34.Inches();
关于c# - 使用枚举实现层次结构的最佳 C# 模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3975515/
我是一名优秀的程序员,十分优秀!