2010-04-15 9 views
6

Que signifie une telle syntaxe en C#?Que signifie une telle syntaxe en C#?

public abstract class HostFactory<TApp> : ServiceHostFactory 
     where TApp : IFoo 
+2

Quelle partie ne comprenez-vous pas? –

+1

Rechercher '.NET Generics' et 'contraintes sur les paramètres génériques' – Gishu

Répondre

2

Alot passe ici et je me demande si c'est des devoirs à cause de la « IFoo », ou peut-être vous fait que le remplacement pour simplifier l'exemple.

- : ServiceHostFactory, HostFactory hérite de ServiceHostFactory.

- HostFactory<TApp>, HostFactory est un type générique car il possède un paramètre de type TApp. Chaque fois que quelqu'un utilise la classe HostFactory, il peut spécifier un type pour TApp qui fera que ce type sera utilisé partout où TApp apparaît dans le code. Donc, si la classe a une fonction TApp GetApp() et ils précisent <int> pour Tapp, puis getapp est en fait int GetApp()

- where TApp : IFoo, Tapp doit implémenter l'interface IFoo (cela aurait pu être une classe aussi bien, ce qui indique qu'il doit hériter de cette classe , pas nécessairement directement). HostFactory est une classe abstraite, ce qui signifie que d'autres classes peuvent en hériter, mais aucun code ne peut instancier la HostFactory elle-même.

- abstract Ce serait comme si je vous donnais le cadre d'une voiture et que vous n'étiez pas légalement autorisé à conduire cette voiture sur la route, mais vous pouvez faire votre propre voiture. HostFactory est public, ce qui signifie qu'il est visible pour le code en dehors de l'assembly dans lequel il a été déclaré.

Edit: En savoir plus sur les génériques Je vais commencer par une citation assez importante de MSDN: « Les médicaments génériques sont la caractéristique la plus puissante de C# 2.0. »

Vous utiliseriez des génériques lorsque vous écrivez quelque chose qui pourrait fonctionner avec de nombreux types. Par exemple, avant d'avoir des génériques dans la version 2.0, nous devions tout jeter dans un objet avant de pouvoir le placer dans une collection, ce qui était vraiment dangereux parce que le copilote ne pouvait pas vérifier que vous utilisiez le bon type un élément de la collection. Avec les génériques nous pouvons faire ArrayList<bool> pour créer une ArrayList de bool et maintenant il n'y a pas besoin de lancer. Le compilateur peut vérifier que nous mettons des bool dans la collection. Par exemple, dans la classe ci-dessus, nous pouvons écrire des algorithmes qui fonctionnent avec des choses qui implémentent IFoo, sachant seulement que l'objet sera capable de faire des choses avec une interface IFoo. Je peux donc écrire un algorithme qui appelle des méthodes sur l'interface IFoo, puis mon algorithme peut être réutilisé dans le futur par quiconque implémente l'interface IFoo.

+0

Pas les devoirs :) –

+0

@hmm Je vais prendre votre mot là-dessus. Avant j'ai répondu, j'ai regardé d'autres questions que vous avez posées dans le passé et il ne semblait pas que vous étiez ce type de personne :) – AaronLS

+0

En fait, les génériques me déroute, quant à quand utiliseriez-vous etc et cette syntaxe wasnt familier à moi non plus (bien que ma conjecture sur les outils était juste, je voulais entendre plus sur comment et quand vous utiliseriez ceci). –

17

HostFactory est une classe générique publique (dérivé de ServiceHostFactory) avec un seul argument de type générique appelé TApp, où tout fourni TApp doit implémenter l'interface IFoo (mise en garde: le modèle IWhatever est simplement une convention, IFoopourrait être une classe, je suppose). Le type HostFactory<TApp> n'est pas un type concret; il doit encore être sous-classé pour être instancié - vraisemblablement par des choses comme ci-dessous (même si une sous-classe générique serait également suffire):

public class BarHostFactory : HostFactory<Bar> {} 
public class Bar : IFoo {...} 
+0

Très bonne explication. Upvote! – Kaili

+0

Merci d'avoir expliqué Marc! –

2

Il dit HostFactory a un type générique TApp et qu'il hérite de ServiceHostFactory et les signaux de mots-clés qui whereTApp est un constrant.

Dans C# 2.0, vous utilisez le mot-clé where réservé pour définir une contrainte. Utilisez le mot-clé where sur le paramètre de type générique suivi d'un deux-points de dérivation pour indiquer au compilateur que le paramètre de type générique implémente une interface particulière.

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

+2

(note de côté: 'where' a d'autres significations dans une contrainte générique que simplement" implémente une interface particulière "- au moins 4 autres utilisations (': struct', ': class',': new() ' , ': SomeBaseType') –