用枚举实现层次结构的最佳C#模式是什么?
发布时间:2020-12-15 04:25:52 所属栏目:百科 来源:网络整理
导读:我正在实现代表距离(或长度)的值类型. 有一个枚举代表不同的度量单位,例如: public enum DistanceUnit { Millimeter,Centimeter,Meter,Kilometer,Inch,Foot,Yard,Mile}; 这些测量属于两个系统之一,即公制或英制.由于枚举不支持层次结构,因此表示此层次结构
我正在实现代表距离(或长度)的值类型.
有一个枚举代表不同的度量单位,例如: public enum DistanceUnit { Millimeter,Centimeter,Meter,Kilometer,Inch,Foot,Yard,Mile }; 这些测量属于两个系统之一,即公制或英制.由于枚举不支持层次结构,因此表示此层次结构的最佳模式是什么? 是使用位标志吗? 给我一些建议…你会如何实现这个? 编辑 – 更多澄清: 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>,... 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,上一个或下一个下降单位. 我以这种方式实行这个错误的树吗? 解决方法
你真的需要一个枚举吗?也许,一个简单的
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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |