J'essaie d'expérimenter une API pour la publication des valeurs à un moment donné (tuples de valeur et heure). Ces échantillons seront utilisés par un visualiseur de données (par exemple un graphique).
Je souhaite associer la valeur avec une quantité et une unité, par exemple de longueur en mètres. De cette façon, mon "spectateur" peut l'accabler de manière appropriée. P>
Je recherche une sorte d'énum hiérarchique, comme ceci: p> mais cela n'existe pas dans c #. P> Je ne suis pas sûr du meilleur modèle pour exprimer cela et je suis arrivé avec ce qui suit. Y a-t-il une façon reconnue ou meilleure de faire cela? p>
5 Réponses :
Votre approche suggérée me semble raisonnable et j'utilise quelque chose de similaire dans un projet de mien. Cependant, je garde la partie valeur réelle de l'objet, et j'utilise Je fais ne recommande pas de créer une enum avec toutes les unités des différents types de mesure combinées; C'est l'enfer de valider l'appareil pour s'assurer que quelqu'un n'a pas réfédié une unité de masse lorsqu'il travaillait avec la longueur. p> utilisation: p> Si vous ne vous souciez pas de garder la valeur et que vous voulez simplement garder les valeurs énumées / statiques dans un endroit central: p> utilisation: struct code> au lieu de la classe
code>, car ils sont naturellement des types de valeur. L'héritage n'est pas nécessaire ici (et non possible avec des structures, de toute façon), donc j'utilise une interface pour créer un contrat et agir comme une contrainte en cas de besoin (je l'ai appelé
iunitofmeasure code>).
var unité = unitéOfMeasure.mass.kilogramme; code> p> p>
Je ne peux pas utiliser la dernière idée de votre message, merci pour l'idée d'interface. +1
Ce n'est pas possible. Enums sont des types primitifs et ne peuvent pas hériter d'autres énums, car l'héritage est une propriété d'objets. P>
Vous ne pouvez pas introduire l'héritage avec Enums. Enums ne sont qu'un mécanisme de commodité pour vous permettre d'utiliser des identifiants textuels significatifs dans votre code. Du code que vous avez, je vous suggère d'utiliser un énumé comme; ou divisé à l'endroit où il est approprié, de sorte que la masse et la longueur sont définies séparément par exemple. P> L'héritage est simplement quelque chose que vous avez introduit dans votre réflexion sur ce problème, mais ce n'est pas nécessaire pour votre solution. Lorsque vous souhaitez gérer la messe, vous ne regardez que les drapeaux / Enums appropriés à la masse. P> p>
Je pense qu'il est préférable de créer une classe (vous devez les faire des types de valeur appropriés en remplacement la classe code> la classe code> peut être étendu pour prévoir par exemple conversions, unités composées, formatage et analyse. P> Ensuite, vous pouvez définir les cas communs à l'intérieur des classes: p> ou définissez vos "hiérarchies" avec Classes statiques: p> unité code> pour l'unité de mesure et une classe
Quantité code> Classe associée à une unité de mesure avec un montant. Regardez le modèle de quantité pour l'idée. Puisque vous souhaitez également enregistrer le "type" de l'unité de mesure, vous pouvez créer une classe
UnitTypeType code> qui enregistre que des informations:
égale code> et
gethascode code>) p>
var eniacWeight = 27.Tons();
Merci pour le lien avec le modèle de Fowler, très intéressant.
L'énum hiérarchique n'est pas possible, comme indiqué ci-dessus. Si vous utilisez exclusivement métrique, vous pouvez utiliser des préfixes standard si cela aide.
enum MeasurementUnits { Gram, Metre, Litre, Hectare // etc } enum MeasurementPrefix { Milli, Natural, Kilo, Mega // etc }
C'est une bonne idée, j'aime ça. +1
Probablement pas ce que vous recherchez, mais considérons f # et Unités de mesure a>.