2009-12-27 8 views
3

Existe-t-il une règle générale pour quand vous devriez et ne devriez pas avoir une interface générique?Quand ne pas implémenter une interface générique?

Mon exemple est une simple interface de trame de données. Un membre "données utilisateur" permet à l'implémentation d'attacher les données spécifiques à l'implémentation qui doivent être associées à la trame. Je ne sais pas s'il faut le laisser comme un type d'objet (et les obliger à le lancer) ou avoir l'interface générique pour ce seul membre afin que le compilateur puisse attraper une mauvaise utilisation.

S'il devient générique, alors une lignée d'utilisation doit également être générique pour que le type soit transmis sur la ligne (si cela a du sens). Cela semble beaucoup de travail pour ce membre, qui est la base de ma question.

Merci!

Répondre

3

Un domaine où les génériques ont tendance à se décomposer un peu est avec des collections hétérogènes. Si vos objets de trames de données sont combinés en un seul type de collection à transmettre, vous pouvez trouver difficile d'appliquer des génériques. En particulier, puisque dans l'exemple que vous fournissez, il ne semble pas y avoir un type de base dont toutes les "données utilisateur" hériteront, autre que l'objet. En fait, dans ces types de problèmes, vous pouvez vous retrouver à définir à la fois une interface générique et une version non générique, de manière à pouvoir transmettre des types de façon polymorphique. Les génériques sont puissants et très utiles, mais dans l'exemple que vous décrivez, je suppose qu'ils peuvent avoir plus de problèmes qu'ils ne le méritent.

+0

Pourquoi auriez-vous besoin de créer une version générique et non générique? Si vous avez besoin d'une version non générique, ne pourriez-vous pas simplement utiliser la version générique mais avec 'object' comme paramètre, par ex. 'Liste '? –

+0

Code plus propre, j'imagine. Beaucoup sinon la plupart des développeurs .NET considèrent que c'est une odeur de code quand 'System.Object' est utilisé comme paramètre de type générique. – Aaronaught

+0

@Mark: La principale raison pour laquelle vous avez souvent besoin d'une interface non générique est que vous pouvez créer des collections qui se réfèrent à l'interface. Les règles pour les génériques vous empêchent de stocker un 'ISomething ' dans un 'IList >' même si MyClass est clairement un objet. Pour faire face à cela, vous avez souvent besoin d'une interface ISomething non générique juste pour pouvoir créer des collections hétérogènes. – LBushkin

3

Questions à prendre en compte lors de votre décision:

  1. Est-ce une erreur de stocker tout objet dans ce membre de données? (Par exemple, attendez-vous/exigez-vous un string, ou est-ce qu'un int suffira?)

  2. Combien de types différents d'objets de données prévoyez-vous d'utiliser? Ont-ils une interface commune ou une classe de base?

  3. Est-ce que cette classe est actuellement utilisée, et va-t-elle changer cette classe pour les autres classes qui l'utilisent?

+0

N'achetez pas ceci. Surtout le premier point compte tenu des contraintes pour limiter les types qui peuvent être utilisés. – Finglas

+0

Hey Dockers, je ne suis pas sûr de comprendre votre commentaire. Peut-être que je dois clarifier le point 1? –

Questions connexes