параметр метода с несколькими интерфейсными ограничениями - PullRequest
2 голосов
/ 08 сентября 2010

В C # можно определить параметр метода с двумя интерфейсными ограничениями. Это с оценками. Например.

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

Таким образом, два интерфейса и первый параметр (param1) метода Foo должны реализовывать оба интерфейса.

Но действительно ли это полезно? AFAIK не возможно привести объект к нескольким интерфейсам в C #? Конечно, класс может реализовывать два интерфейса.

Ответы [ 3 ]

4 голосов
/ 08 сентября 2010

Иногда у вас есть обобщенная логика, которая требует функциональности от нескольких типов одновременно.Например, мне когда-то приходилось выполнять ту же логику для элементов управления Button, LinkButton и ImageButton из ASP.NET.Каждый из них по отдельности происходит от WebControl и реализует интерфейс IButtonControl;нет базового класса, который их объединяет.

Мне нужно было связать обработчик с событием Click, предоставляемым IButtonControl, и установить обработчик кликов клиента через коллекцию Attributes, которая доступнана WebControl.Чтобы включить метод, который выполняет обе функции, я выбрал только несколько ограничений типа:

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

    button.Click += ...;

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

    return button;
}
3 голосов
/ 08 сентября 2010

Вы, безусловно, можете назначить его по одному:

IA asIA = param1;
IB asIB = param1;

Кроме того, вы можете использовать его как любой, даже без этих строк (предположим, что они принимают параметр IA или IB, соответственно)

IAFunc(param1);
IBFunc(param1);
2 голосов
/ 08 сентября 2010

Это очень полезно, если шаблонный класс требует функциональности от нескольких интерфейсов.Например, может быть, вы хотите, чтобы классы были сопоставимы друг с другом, IComparable , и вы также хотите убедиться, что пользователь вашего шаблона шаблона не забывает переопределить ToString(), чтобы данные могли отображаться, IFormattable .

Это несколько надуманный ответ, но возможность многократно указывать точные интерфейсы позволяет вам сохранять функциональность в его интерфейсе, не загромождая его.

...