Ответ 1
Объясняется в разделах 13.4.4-13.4.6 спецификации С# 5. Соответствующие разделы приводятся ниже, но в основном, если вы явно заявляете, что класс реализует интерфейс, который снова запускает сопоставление интерфейсов, поэтому компилятор принимает этот класс как тот, который будет использоваться для разработки, к какой реализации сопоставляется каждый член интерфейса.
13.4.4 Отображение интерфейса
Класс или структура должны обеспечивать реализации всех членов интерфейсов, перечисленных в списке базового класса класса или структуры. Процесс определения реализаций элементов интерфейса в реализующем классе или структуре известен как отображение интерфейса.
Отображение интерфейса для класса или структуры
C
находит реализацию для каждого члена каждого интерфейса, указанного в списке базового классаC
. Реализация конкретного члена интерфейсаI.M
, гдеI
- это интерфейс, в котором объявлен членM
, определяется путем изучения каждого класса или структурыS
, начиная сC
и повторяя для каждого последующего базовый классC
, пока не будет найдено совпадение:
- Если
S
содержит объявление явной реализации члена интерфейса, которая соответствуетI
иM
, то этот элемент является реализациейI.M
.- В противном случае, если
S
содержит объявление нестатического открытого элемента, который соответствует M, то этот член является реализациейI.M
. Если встречается более одного члена, то не указано, какой элемент является реализациейI.M
. Эта ситуация может возникнуть только в том случае, еслиS
является построенным типом, в котором два члена, объявленные в родовом типе, имеют разные подписи, но аргументы типа делают их подписи идентичными....
13.4.5 Наследование реализации интерфейса
Класс наследует все реализации интерфейса, предоставляемые его базовыми классами. Без явного повторного внедрения интерфейса производный класс никоим образом не может изменять сопоставления интерфейсов, которые он наследует от своих базовых классов. Например, в объявлениях
interface IControl { void Paint(); } class Control: IControl { public void Paint() {...} } class TextBox: Control { new public void Paint() {...} }
метод
Paint
вTextBox
скрывает методPaint
вControl
, , но он не изменяет отображениеControl.Paint
наIControl.Paint
и вызываетPaint
через экземпляры классов и экземпляры интерфейса будут иметь следующие эффектыControl c = new Control(); TextBox t = new TextBox(); IControl ic = c; IControl it = t; c.Paint(); // invokes Control.Paint(); t.Paint(); // invokes TextBox.Paint(); ic.Paint(); // invokes Control.Paint(); it.Paint(); // invokes Control.Paint();
...
13.4.6 Реализация интерфейса
Класс, который наследует реализацию интерфейса, разрешается повторно реализовать интерфейс, включив его в список базового класса.
Повторная реализация интерфейса следует точно таким же правилам сопоставления интерфейсов, что и первоначальная реализация интерфейса. Таким образом, унаследованное сопоставление интерфейсов не оказывает никакого влияния на отображение интерфейса, установленное для повторной реализации интерфейса. Например, в объявлениях
interface IControl { void Paint(); } class Control: IControl { void IControl.Paint() {...} } class MyControl: Control, IControl { public void Paint() {} }
тот факт, что
Control
отображаетIControl.Paint
наControl.IControl.Paint
, не влияет на повторную реализацию вMyControl
, которая отображаетIControl.Paint
наMyControl.Paint
.