J'implémente des types de valeurs qui représentent une distance (ou une longueur). Il y a un ENUM qui représente les différentes unités de mesure, par exemple:Quel est le meilleur modèle C# pour implémenter une hiérarchie avec une énumération?
public enum DistanceUnit
{
Millimeter,
Centimeter,
Meter,
Kilometer,
Inch,
Foot,
Yard,
Mile
};
Ces mesures entrent dans l'un des deux systèmes - soit métrique ou impérial. Puisque enum ne supporte pas les hierachies, quel est le meilleur modèle pour représenter cette hiérarchie?
Est-ce d'utiliser des drapeaux de bit? Ou utiliser deux enums séparés avec quelques méthodes pour les corréler? Ou pour déclarer des membres statiques au lieu d'enums? Donnez-moi quelques conseils ... comment vous mettre en œuvre cela?
Edition - Plus d'éclaircissements: J'ai plusieurs struct immuables (généré par T4), qui représentent différentes mesures:
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, ainsi qu'une distance immuable code à la main, destiné à représenter toute mesure:
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
}
}
Renoncer une discussion pour savoir si la distance doit être converti en UOM correcte par le code appelant, ToString a pour but de convertir la valeur vers le haut ou vers le bas sur la même mesure (impériale ou métrique) représentée par le UnitOfMeasure actuel.
Il est évident que tout ceci pourrait être codé en dur dans la méthode ToString, mais étant donné que j'implémente aussi TypeConverters et FormatProviders pour tout ce shibang, j'aimerais trouver un moyen générique de déterminer, à partir d'un DistanceUnit, l'unité de mesure appropriée suivante ou suivante serait. Suis-je aboyer le mauvais arbre en voulant mettre en œuvre de cette manière?
J'utiliser [Flags] comme vous le suggérez de mettre en œuvre les catégories dans les bits MSB et le faible pour représenter l'exposant. – kenny