2010-09-08 7 views
2

En C#, il est possible de définir un paramètre de méthode avec deux restrictions d'interface. Ceci avec des limites. Par exemple.paramètre de méthode avec plusieurs restrictions d'interface

interface IA 
{ 
    int A {get;} 
} 
interface IB 
{ 
    int B {get;} 
} 
void Foo<T>(T param1) where T: IA, IB {} 

donc deux interfaces et le premier paramètre (param1) du procédé Foo doit mettre en oeuvre les deux interfaces.

Mais est-ce vraiment utile? AFAIK il n'est pas possible de lancer un objet sur plusieurs interfaces en C#? Bien sûr, une classe peut implémenter deux interfaces.

+0

double possible de [? Est-il possible de faire un paramètre de mettre en œuvre deux interfaces] (http://stackoverflow.com/questions/772053/est-il-possible-de-faire-un-paramètre-implémenter-deux-interfaces) –

+0

@RobertMacLean n'est pas un doublon. C'est l'inverse – Julian

Répondre

2

Ceci est très utile si la classe modélisée requiert des fonctionnalités de plusieurs interfaces. Par exemple, vous avez peut-être besoin que les classes soient comparables les unes aux autres, IComparable, et vous voulez également vous assurer que l'utilisateur de votre classe modèle se souvient de surcharger ToString() afin que les données puissent être affichées, IFormattable.

C'est une sorte de réponse artificielle, mais être capable de spécifier plusieurs fois des interfaces précises vous permet de garder la fonctionnalité dans son interface sans être encombré.

3

Vous pouvez certainement l'attribuer à un à la fois:

IA asIA = param1; 
IB asIB = param1; 

De plus, vous pouvez l'utiliser comme non plus, même sans ces lignes (en supposant que ceux-ci prennent un paramètre IA ou IB, respectivement)

IAFunc(param1); 
IBFunc(param1); 
+0

@Keith, je ne suis pas. Tout d'abord, 'Foo' est une méthode pas un type, donc" est un Foo "n'a pas de sens. Deuxièmement, ni IAFunc ni IBFunc ne doivent savoir que param1 est aussi IB ou IA (respectivement). Ils peuvent juste le traiter comme une instance régulière du type dans leur nom. –

+0

Oubliez ça. Je vois ce que vous essayez de dire que vous pouvez faire dans le contexte de Foo comme méthode. – KeithS

4

Parfois, vous disposez d'une logique générique qui nécessite des fonctionnalités de plusieurs types simultanément. Par exemple, j'ai déjà dû effectuer la même logique sur les contrôles Button, LinkButton et ImageButton à partir de ASP.NET. Ils dérivent chacun séparément de WebControl et implémentent l'interface IButtonControl; il n'y a pas de classe de base qui les unit.

je devais câbler un gestionnaire à l'événement Click, exposé par IButtonControl, et définir un gestionnaire de clic client à travers la collection Attributes, qui est exposée par WebControl. Pour activer une méthode qui combine les deux, mon seul choix était de multiples contraintes de type:

private T CreateButton<T>() where T : WebControl, IButtonControl, new() 
{ 
    var button = new T(); 

    button.Click += ...; 

    button.Attributes["onClick"] = ...; 

    return button; 
} 
+0

+1 Bon exemple. – linuxuser27