Как объявить переменную / параметр типа «Интерфейс управления реализацией ISomething»? - PullRequest
1 голос
/ 14 февраля 2009

Я хочу объявить переменную таким образом, чтобы ей можно было присваивать только значения, которые являются производными от Control, а также реализуют интерфейс ISomething.

Я намерен добавить интерфейс ISomething в производные элементов управления.

Я хотел бы получить SpecialTextBox и SpecialDatePicker из TextBox и DatePicker и реализовать интерфейс ISomething для каждого.

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

Итак ... Как мне объявить переменную типа "Control, которая также реализует ISomething" ?

В идеале ответ должен быть в VB.Net, но меня также заинтересовал бы метод C #.

1 Ответ

10 голосов
/ 14 февраля 2009

Один из способов сделать это с помощью обобщений - то есть обобщенного метода:

void Foo<T>(T control) where T : Control, ISomething
{
    // use "control"
    // (you have access to all the Control and ISomething members)
}

Теперь вы можете вызывать Foo only с другими переменными, которые Control, которые реализуют ISomething - вам не нужно указывать универсальный шаблон, хотя:

Foo(someName);

это все, что вам нужно. Если вы дали ему что-то, отличное от Control и ISomething, компилятор сообщит вам.


Обновление: я не "делаю" VB, но рефлектор говорит мне, что вышеприведенное переводится как:

Private Sub Foo(Of T As { Control, ISomething })(ByVal control As T)

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...