2010-01-03 3 views
1

J'ai un attribut dans ma classe de voiture appelé VehicleType.J'utilise un Enum le meilleur moyen de faire une liste des différents "types de voitures"

L'utilisation d'un ENUM, je pourrais énumérer les différents types de voitures qui existent et non permettent tout autre type à écrire dur.

Le problème est, si je dois obtenir l'attribut d'ailleurs, J'obtiendrai une valeur numérique, et non le littéral de chaîne que j'ai sauvé.

Que dois-je utiliser ici?

class Hero 
{ 
    public string faction; 
    public string name; 
    public string herotype; 

    enum HeroType 
    { 
     Agility, 
     Strength, 
     Intelligence, 
    } 
} 
+0

Cochez les méthodes pour analyser une énumération d'un int pour votre question d'origine. Je suis d'accord avec l'approche "une classe de base", mais si vous utilisez l'enum comme marqueur: Consultez la documentation pour plus d'aide et exposez directement l'énumération. –

Répondre

3

Vous pouvez créer une classe de base abstraite

public abstract class BaseHero 
{ 
    public string faction; 
    public string name; 
    ...... more properties 
} 

puis dériver vos héros de cette:

public class AgilityHero : BaseHero 
{ 
} 

public class StrengthHero : BaseHero 
{ 
} 

public class IntelligenceHero : BaseHero 
{ 
} 

étoffe commune serait traitée et codifiés dans la classe de base, ces choses spécifique à un type de héros dans la classe de héros réelle.

En utilisant cette approche OO, vous pouvez vous éviter d'avoir à écrire, code, maintenir un grand nombre de if....then.....else ou switch déclarations dans votre Hero classe - les différences sont traitées par le fait d'avoir différents types pour chaque type de héros.

+0

Je pensais à cela aussi, mais en pensant à Warcraft 3, il n'y a vraiment aucune différence entre ces héros autres que leur attribut principal? Cela dépend vraiment si il a réellement besoin d'ajouter des méthodes/propriétés spécifiques pour chaque héros "type" – mpen

+0

Grande réponse, et je peux voir pourquoi vous avez suggéré des classes abstraites. Une petite voiture pourrait avoir des sièges chauffants, un semi énorme pourrait même ne pas venir avec un tel que cela signifierait un attribut vide. J'aurais dû dire, cependant, que HeroType va être utilisé strictement comme un moyen de filtrer quelles images sont montrées. Donc, si dix voitures sont montrées sur le formulaire, si quelqu'un va "Montrez-moi les héros de l'Agilité", tous les autres placeront le .Visible à faux. –

+0

C'est une excellente méthode, mais comment géreriez-vous le changement de type de Héros si cela devenait une exigence? –

3

Quoi? Pourquoi auriez-vous une chaîne littérale et une énumération? Votre classe devrait ressembler à ceci:

class Hero 
{ 
    public string faction; 
    public string name; 
    public HeroType herotype; // <-- not a string 

    enum HeroType 
    { 
     Agility, 
     Strength, 
     Intelligence, 
    } 
} 

La version « string » est juste le ENUM il est donc plus facile à retenir pour vous, mais ne devrait pas vraiment être enregistré en tant que chaîne partout (sauf si vous avez besoin pour l'afficher à l'utilisateur).

+0

Oui, j'ai attrapé ça quand je suis revenu au PC. Hehe. –

0

Ce que je fais parfois pour modéliser les types « d'énumération » plus riches est la suivante:

public enum HeroTypeValue 
{ 
    Agility, 
    Strength, 
    Intelligence 
} 


public class HeroType 
{ 
    public HeroTypeValue Value { get; set; } 
    public string Description { get; set; } 

    // ... other properties and possibly behaviour, as needed 

    public static HeroType Agility = new HeroType 
          { 
           ID = HeroTypeValue.Agility, 
           Description = "Agility" 
          }, 

    public static HeroType Strength = new HeroType 
          { 
           ID = HeroTypeValue.Strength, 
           Description = "Agility" 
          }; 

    public static HeroType Intelligence = new HeroType 
          { 
           ID = HeroTypeValue. Intelligence, 
           Description = "Intelligence" 
          }; 

    public static IEnumerable<HeroType> All = new [] 
    { 
     Agility, 
     Strength, 
     Intelligence 
    } 
} 

Cela permet de faire la liaison de données avec des descriptions facilement personnalisables, en cas de besoin, vous pouvez également synchroniser avec une table dans la base de données.

Vous pouvez bien sûr le combiner avec la réponse de marc_s, faisant de HeroType une classe de base (abstraite ou non) pour une valeur OO ajoutée.

1

La conformité d'une énumération dépend entièrement de votre conception. Si vous avez un nombre fixe de valeurs possibles, alors une énumération peut être une bonne approche. En C# vous pouvez convertir entre un type énuméré et sa représentation de chaîne en utilisant Enum.ToString() et Enum.Parse(), donc il est trivialement facile de sérialiser une valeur d'enum et d'interdire les valeurs "illégales" lors du rechargement des données. Il n'est pas nécessaire de le sérialiser en tant que valeur entière.

(L'une mise en garde de c'est si vous utilisez obscurcissement, vous devez vous assurer de ne pas obscurcir le type dénombrée)

Si vous avez pour stocker l'ENUM en tant que valeur entière, alors il n'y a pas de problème avec cela, tant que vous ne modifiez pas les valeurs des entrées enum - ajoutez de nouvelles entrées à la fin de la liste d'énumération, mais n'insérez pas de nouvelles entrées au milieu.

Questions connexes