Estoy implementando tipos de valores que representan una distancia (o longitud). Hay una enumeración que representa las diferentes unidades de medida, por ejemplo:¿Cuál es el mejor patrón de C# para implementar una jerarquía con una enumeración?
public enum DistanceUnit
{
Millimeter,
Centimeter,
Meter,
Kilometer,
Inch,
Foot,
Yard,
Mile
};
Estas mediciones caen en una de dos sistemas - ya sea métrico o imperial. Dado que enum no admite jerarquías, ¿cuál es el mejor patrón para representar esta jerarquía?
¿Es para usar banderas de bits? ¿O usa dos enumeraciones separadas junto con algunos métodos para correlacionarlas? O para declarar miembros estáticos en lugar de enumeraciones?
Dame un consejo ... ¿cómo sería que implementar esto?
Editar - Más aclaración: Tengo varias estructuras inmutables (generada por T4) que representan diversas medidas:
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 ....
... etc, así como una distancia inmutable codificado a mano, la intención de representar cualquier medida:
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
}
}
Renunciando a una discusión acerca de si la distancia debe ser convertida a la UOM correcta mediante el código de llamada, el objetivo aquí es que ToString convierta el valor hacia arriba o hacia abajo en la misma medición (imperial o métrica) que se representa con el UnitOfMeasure actual.
Obviamente, todo esto podría estar codificado en el método ToString, pero dado que también estoy implementando TypeConverters y FormatProviders para todo este shibang, me gustaría encontrar un medio genérico para descifrar, desde una DistanceUnit, qué la unidad de medida apropiada siguiente o posterior sería.
¿Estoy ladrando al árbol equivocado al querer aplicar de esta manera?
yo usaría [Banderas] como sugieres para implementar las categorías en los bits MSB y el bajo con el fin de representar el exponente. – kenny