Pour clarifier: Au lieu d'utiliser enums, où enum indique la méthode à utiliser, j'utilise des classes dérivées de la même classe de base. Ainsi, au lieu de sélectionner une méthode utilisant enum, l'utilisateur sélectionnera une classe qu'il veut utiliser (via une interface déroulante), et la classe contiendra une substitution de la méthode qui sera appelée. Après l'avoir fait fonctionner comme indiqué ci-dessous j'ai essayé de regarder en ligne pour voir si je le fais bien. C'est une méthode qui résout beaucoup de problèmes, mais mon problème est que je ne connais pas la terminologie pour la décrire et pour vérifier si elle peut causer de sérieux problèmes à l'avenir. Avant d'utiliser Enums pour sélectionner un outil que je veux utiliser (enum tool {brush, gomme, drag}). Mais pour rendre tout plus efficace au lieu d'utiliser Enum, je crée maintenant une classe pour chaque outil qui dérive de la classe de base "ToolType". Ensuite, j'utilise la réflexion pour trouver toutes les classes qui héritent de ToolType et les placer dans un tableau statique. Et maintenant j'utilise cette méthode pour la plupart des choses dans mon projet, il est facile d'ajouter/supprimer des choses, pas besoin d'éditer une matrice enum chaque fois que vous ajoutez une nouvelle classe. Cela ressemble à la meilleure solution pour un projet modulaire, mais je n'ai pas encore trouvé d'exemples de cela, alors je ne suis pas sûr de le faire de la bonne façon. Que devrais-je rechercher?Meilleure façon d'implémenter le sélecteur de classes
static Family() {
List<Type> allTypes = CsharpFuncs.GetAllChildTypesOf<T>();
family = new T[allTypes.Count];
names = new string[allTypes.Count];
Debug.Log("Creating "+typeof(T).ToString());
for (int i = 0; i < allTypes.Count; i++) {
Debug.Log("Adding " + allTypes[i].ToString());
T tmp = (T)Activator.CreateInstance(allTypes[i]);
family[i] = tmp;
tmp.index = i;
names[i] = tmp.ToString();
}
}
C'est le constructeur de
public class Family<T> where T : Family<T>
Je peux avoir
public class newToolBase : Family<newToolBase> {
}
gomme à effacer public class: newToolBase {
}
crayon public class: newToolBase {
}
J'utilise l'unité et ce que je veux dire par « sélection » est l'option généralement de sélectionner manuellement quelque chose dans un menu déroulant. Comme vous voyez la classe de base a un tableau de noms et ils sont affichés lorsque l'utilisateur sélectionne quelque chose. Chaque objet spawnable, chaque méthode AI utilise cette classe. Je viens d'ajouter un script dérivé de la classe de base qui à son tour dérive de la classe famille et il peut être sélectionné ou ajouté à une liste.
De commentaires ci-dessous j'ai découvert sur l'injection de dépendances et en cours de lecture à ce sujet. J'ai écrit ceci dans l'espoir que les gens reconnaîtront immédiatement ce que j'essaie de faire et montreront quelque chose comme ça.
Pour clarifier, il n'y a pas de problème évident avec mon approche mais avant de passer des heures à remplacer beaucoup d'enums avec ceci je veux m'assurer. Merci.
Utilisez-vous l'injection de dépendance? par exemple. 'Unity',' MEF', 'Ninject' – Nova
Contre-indication: Que faire si vous avez besoin d'un deuxième ensemble de ToolTypes? Un que vous ne voulez pas être sélectionnable, où le premier ensemble est ... – Fildor
Il semble que vous demandiez un [modèle] (http://www.dofactory.com/net/design-patterns), pourtant vous n'avez pas montré quel est le problème. Sélecteur? Par quoi? Par clé - dictionnaire, par index - collection ... Aussi quel est le critère de pourquoi la méthode actuelle est mauvaise? Seulement des doutes? Dites à tout le monde d'aller en enfer, vous êtes le programmeur, c'est votre tâche ... – Sinatr