2010-07-11 3 views

ответ

17

Да, в данном случае это не имеет никакого значения. В некоторых случаях это может иметь значение, если вы используете базовый класс, который уже реализует интерфейс, но вы хотите явно его переопределить - но в этом случае нет базового класса (кроме неявного object), и он будет вести себя точно так же.

Вопреки моим воспоминаниям, я не верю, что существует разница в том, как класс представлен в метаданных независимо от того, явно ли он объявляет все интерфейсы или нет. Вот пример:

interface IFoo {} 
interface IBar : IFoo {} 

class FooBar1 : IBar {} 
class FooBar2 : IBar, IFoo {} 

Оба ILDASM и рефлектор показывает ту же информацию для FooBar1 и FooBar2 ... он показывает оба реализации IBar и IFoo.

Другими словами, мы не можем определить, действительно ли исходный код для List<T> указывает все интерфейсы или нет. Может быть, так оно и есть, может быть, нет, но это не имеет значения.

EDIT: Для полноты я также проверил случаи, когда вы расширяете два интерфейса с другим интерфейсом. В этом случае я не могу найти разницу в метаданных. Я уверен, что я помню некоторую ситуацию, в которой это было очевидно, но я не могу найти его сейчас.

+0

Так как базового класса нет. Это не имеет значения. Тогда почему разработчики унаследовали эти два интерфейса «снова»? –

+0

@Marco: См. Мой отредактированный ответ. –

+0

Получил это. Большое спасибо. Это было быстро. –

5

Да, это так. IList<T> сам реализует два других.

Объект браузер показывает все интерфейсы, класс реализует, либо непосредственно (IList<T>) или косвенно (ICollection<T>, IEnumerable<T>, черезIList<T>).

+0

Вы имеете в виду, что это всего лишь трюк, который делает браузер объектов, чтобы облегчить нам задачу? –

+0

Ну, если вы хотите сказать так. Я действительно думаю, что это потому, что код браузера просто перечисляет весь реализованный интерфейс, не заботясь о том, чтобы отфильтровывать те, которые распространяются другими. – Mau

3

Это не так, как это было на самом деле закодировано за кулисами. Вот именно такие инструменты, как Reflector, показывают вам, когда он превращает IL обратно в C#.

+0

Вы также можете увидеть его в программе просмотра кода. – Incognito

+0

@Incognito: codeviewer генерирует его из метаданных так же, как и рефлектор. – EFraim