7
votes

où T: plusieurs classes

List<T> Foo<T>(Ilist list) 
where T : ??
is there any way to enforce T to be
one of few classes ?eventually i want to do a switch on T..thanks.

4 commentaires

Ces peu de classes sont-ils liés ou partagent-ils une classe de base commune ou une interface qui les utilisent tous?


Sachez simplement que vous pouvez parfois aller trop loin avec des génériques. Je travaille récemment sur quelque chose et j'ai eu une structure générique complexe où j'avais CLASSA où p , s . C'était tout ce qui est gentil et générique, mais a fini par être ingéniel et je ne pouvais pas l'utiliser efficacement. Au lieu de cela, j'ai dû diviser le code 3 manières et accepter un code similaire dans différentes classes.


Voici une règle rapide - si vous pensez à faire commutateur sur t ou même le vérifier avec un si , vous faites des génériques tort. Faites un pas en arrière et faites comprendre comment.


@Kobi: à cela, j'ajouterais que lorsqu'une instance de paramètre est reçue sous forme de type T, l'instance est garantie du T ou un type dérivé de T; Il n'y a aucune garantie t sera le type exact. L'utilisation de génériques avec des contraintes peut éliminer la nécessité de tester le type d'une instance particulière, mais en l'absence de génériques, il faudrait tester le type de temps d'exécution d'un paramètre, tester le type d'exécution de T ne changera pas. la nécessité de tester le type du paramètre.


5 Réponses :


6
votes

Dans ce cas, il pourrait être une classe de base courante ou une interface que vous listeriez les objets partagés. Vous pouvez avoir list et la liste pourrait contenir des classes foo, bar et baz si elles implémentent chaque interface ifoo . À court d'utilisation de l'héritage, vous seriez coincé avec une liste d'objets.


0 commentaires

15
votes

Vous pouvez exiger que chaque classe que vous souhaitez autoriser dans votre liste implémente une interface iSomething , puis crée une liste . .

Finalement, je veux faire un commutateur sur t ..

au lieu d'un commutateur sur le type de l'objet, il peut être préférable d'avoir une méthode dans votre interface et de la mettre en œuvre différemment pour chaque classe.


0 commentaires

1
votes

Autant que je sache, cela n'est pas possible. Je recommanderais de dériver votre jeu de classes limité d'une classe de base commune ou d'une interface.


0 commentaires

11
votes

Appliquer une contrainte de type de cette manière indique que ces plusieurs classes sont liées à la fonctionnalité courante.

Vous devez implémenter une interface commune, puis limiter le type à cette interface: P>

public interface IUseful
{
    public void UsefulMethod();
}

List<T> Foo<T>(IList list) where T : IUseful
{
    // You now have access to all common functionality defined in IUseful
}


1 commentaires

Je cherchais quelque chose de similaire. Je suis d'accord une interface commune est la meilleure solution. Bien que, actuellement, j'utilise deux bibliothèques et je ne peux pas modifier leur code pour utiliser l'interface commune. Alors y a-t-il un moyen de le faire sans interface?



2
votes

Qu'est-ce que tu veux? Après le côlon, vous pouvez énumérer les types auxquels vous contraintes t à.

Pour plusieurs classes, peut-être implémenter une interface générique et définir votre contrainte pour cela pourrait faire le tour.

Veuillez regarder ce lien pour plus de détails: Contraintes sur les paramètres de type (C # Guide de programmation)


0 commentaires