J'essaie actuellement de faire ressortir des types génériques. Donc, l'idée de base est d'avoir une méthode qui accepte un type générique et que des trucs différents en fonction duquel le type est passé.
Pour des raisons de simplicité, je voudrais simplement mettre en valeur l'utilisation de La configuration ressemble à ceci (où où Si je ne le fais pas comme ça (j'ai essayé certains Quelqu'un peut-il savoir une meilleure façon de le faire? P> Merci d'avance,
Bothline P> Edit:
Étant donné que beaucoup de gens ont dit une sorte de la même chose, que je ne devrais pas utiliser des génériques du tout dans un cas comme ça ou que mes méthodes devraient être plus génériques elles-mêmes ..
Mon problème ici est que j'ai besoin d'utiliser des méthodes tierces pour gérer les cas spéciaux que je vérifie (dans ce cas le Pour aller un peu plus en détail pourquoi c'est le cas:
Je travaille actuellement sur un plugin pour le "moteur unity". L'unité a intégré des méthodes pour afficher des types (type de tous types primitifs et certains types spécifiques à unité). J'ai une classe d'emballage générique qui devrait pouvoir contenir des types. Mais lorsque je veux afficher le contenu de cet emballage dans l'interface graphique que l'éditeur Unity propose, je dois utiliser les méthodes intégrées pour afficher les primitives (quelque chose comme float code>,
BOOL code> et
défaut code> p>
t code> est un type générique défini par la classe elle-même): < / p>
dofloatstuff code> et
doboolstuff code> ne sont que des méthodes qui ont 1 paramètre et un type de retour de leurs types respectivement. p>
typeof () Code> Casting avant), le compilateur se plaint toujours qu'il ne peut pas lancer de
t code> à
float code> et vice versa, même que je suis assuré que ce serait le cas avec quelques déclarations de cas-Switch / if-else. P>
float code> et
BOOL code> types). Pour le cas par défaut, j'ai déjà tout manipulé de manière générique. Mais pour certains types définis, je ne peux tout simplement pas faire ça. P>
Unityeditor.etitritrui.floatfield () code> ). Sans ces méthodes, je ne suis jamais capable d'afficher quoi que ce soit.
Quelque chose d'autre qui peut être divisé en ces types peut alors être affiché de manière plus générique. P> p>
3 Réponses :
Ainsi, l'idée de base est d'avoir une méthode qui accepte un type générique et que des trucs différents selon lesquels sont transmis. P>
C'est la mauvaise idée. Ce n'est pas la façon dont les génériques devraient être utilisés. Dans un tel cas, vous devez utiliser la surcharge de la méthode pour créer le
dostuff code> pour chaque type individuellement: p>
xxx pré> Le point de générique consiste à vous permettre de vous permettre de Écrivez un code qui fonctionnera de la même manière sur différents types - il devrait donc être utilisé sur l'endroit où le type lui-même n'est pas pertinent pour le code (comme dans une collection générique) ou peut être exécuté avec une interface ou une classe de base tous les types acceptables. (ou hérite). À ce stade, les génériques ne sont généralement nécessaires que lorsque vous souhaitez qu'une méthode renvoie une implémentation spécifique d'une interface (ou de classe de base). P> blockQquote>
Hey, merci beaucoup pour votre commentaire. Je suis d'abord édité mon poste initial pour me faire un peu plus clair, car je n'ai pas tout expliqué très bien. En raison, je voulais bien sûr gérer la plupart des cas de manière générique, il n'y avait que quelques cas particuliers que je dois régler. Mais bien oui, votre "ce n'est pas l'idée des génériques" m'a vraiment fait penser. Et je devrais pouvoir simplement utiliser la méthode dostuff code> de manière générique, puis hériter avec mes cas spéciaux et remplacer cette méthode de la bonne manière, car je n'aurai aucune vérification de type. plus. Merci beaucoup! :)
Heureux de vous aider :-)
Laissez le compilateur le trier pour vous:
protected void DoStuff(float v){} protected void DoStuff(int v){} // and so on //and finally the default: protected void DoStuff(object v){} public void Work(T value) { DoStuff(value) }
Ce n'est pas la réponse courte, mais c'est la bonne façon (par de nombreuses normes). Il pourrait y avoir une réponse courte, mais si j'étais vous, je ne me dérangerais pas.
C'est l'odeur d'un motif d'usine. Un générique devrait être, comme le nom le suggère, générique et indifférent aux types si vous pouvez faire quelque chose comme ça. P> alors vous pouvez avoir une usine vous donner une usine Mise en œuvre correcte p>
Si
dofloatstuff code> et
Doboolstuff code> sont si différents qu'ils ne peuvent pas être "généralisés" alors vous n'avez aucune utilisation de génériques. Il suffit d'abandonner et d'avoir
objet dostuff (valeur d'objet) code>.
@Dialecticus qui devrait être la seule option si vous ne connaissez pas le type de l'objet. Si le compilateur peut comprendre le type au moment de la compilation, il devrait utiliser la surcharge de la méthode, pas les génériques et le plus certainement pas
objet code>.