Partial 5 страница.
Если не удается выявить реализации для всех членов всех интерфейсов, указанных в списке базовых классов C, возникает ошибка при компилировании. Обратите внимание, что члены интерфейса содержат члены, наследуемые из базовых интерфейсов. При сопоставлении интерфейсов член класса A считается соответствующим члену класса B в указанных ниже случаях. · A и B являются методами, у A и B совпадают имена, типы и списки формальных параметров. · A и B являются свойствами, у A и B совпадают имена и типы, A имеет те же методы доступа, что и B (A может иметь дополнительные методы доступа, если этот член не относится к явным реализациям члена интерфейса). · A и B являются событиями, у A и B совпадают имена и типы. · A и B являются индексами, у A и B совпадают типы и списки формальных параметров, A имеет те же методы доступа, что и B (A может иметь дополнительные методы доступа, если этот член не относится к явным реализациям члена интерфейса). Алгоритм сопоставления интерфейсов предполагает следующее: · При определении члена класса или структуры, реализующего член интерфейса, явные реализации члена интерфейса имеют приоритет по сравнению с другими членами того же класса или структуры. · В сопоставлении интерфейсов не участвуют члены, которые являются статическими или не относятся к открытым. В примере кода interface ICloneable class C: ICloneable public object Clone() {...} реализацией метода Clone интерфейса ICloneable становится член ICloneable.Clone класса C, поскольку явные реализации имеют приоритет по отношению к другим членам. Если в классе или структуре реализуется два или более интерфейса, содержащих член с одинаковым именем, типом и типами параметров, можно сопоставить каждый из таких членов интерфейса единственному члену класса или структуры. Например: interface IControl interface IForm class Page: IControl, IForm В этом примере методу Paint класса Page сопоставляются методы Paint как класса IControl, так и класса IForm. Разумеется, для каждого из этих двух методов можно создать отдельную явную реализацию члена интерфейса. Если в классе или структуре реализуется интерфейс, который содержит скрытые члены, некоторые члены необходимо реализовать с использованием явных реализаций члена интерфейса. Например: interface IBase interface IDerived: IBase Для реализации этого интерфейса потребуется по меньшей мере одна явная реализация члена интерфейса в одной из приведенных ниже форм class C: IDerived int IDerived.P() {...} class C: IDerived int IDerived.P() {...} class C: IDerived public int P() {...} Если в классе реализуется несколько интерфейсов с одним базовым интерфейсом, может существовать только одна реализация этого базового интерфейса. В примере кода interface IControl interface ITextBox: IControl interface IListBox: IControl class ComboBox: IControl, ITextBox, IListBox void ITextBox.SetText(string text) {...} void IListBox.SetItems(string[] items) {...} невозможно иметь отдельные реализации интерфейса IControl, включенного в список базовых классов, интерфейса IControl, наследуемого интерфейсом ITextBox, и интерфейса IControl, который наследуется интерфейсом IListBox. Для этих интерфейсов отсутствует указание на их различие. Наоборот, в реализациях интерфейсов ITextBox и IListBox используется одна и та же реализация интерфейса IControl, а класс ComboBox просто считается реализующим три интерфейса: IControl, ITextBox и IListBox. Члены базового класса участвуют в сопоставлении интерфейсов. В примере кода interface Interface1 class Class1 public void G() {} class Class2: Class1, Interface1 метод F в классе Class1 используется в реализации интерфейса Interface1 в классе Class2. 13.4.5 Наследование реализаций интерфейсов Класс наследует все реализации интерфейсов, содержащиеся в его базовых классах. Без явной повторной реализации интерфейса, в производном классе нельзя изменить сопоставление интерфейсов, унаследованных им из базовых классов. Например, в объявлениях interface IControl class Control: IControl class TextBox: Control метод Paint классе TextBox скрывает метод Paint в классе Control, однако не меняет сопоставление Control.Paint с IControl.Paint, вызов же метода Paint в экземплярах класса и экземплярах интерфейса приведет к следующим результатам Control c = new Control(); Тем не менее, при сопоставлении метода интерфейса с виртуальным методом в классе можно переопределить этот виртуальный метод в производных классах и изменить реализацию интерфейса. Например, изменение записи приведенных выше объявлений на interface IControl class Control: IControl class TextBox: Control приведет к следующим результатам Control c = new Control(); Так как явные реализации метода интерфейса не могут быть объявлены виртуальными, переопределить явную реализацию члена интерфейса невозможно. Однако в явной реализации члена интерфейса можно вызвать другой метод, который может быть объявлен виртуальным, что позволяет переопределить его в производных классах. Например: interface IControl class Control: IControl protected virtual void PaintControl() {...} class TextBox: Control В этом примере в классах, являющихся производными от класса Control, можно указать реализацию метода IControl.Paint путем переопределения метода PaintControl. 13.4.6 Повторная реализация интерфейса В классе, который наследует реализацию интерфейса, разрешается повторно реализовать этот интерфейс путем включения его в список базовых классов. Для повторной реализации интерфейса действуют такие же правила сопоставления интерфейсов, что и для первой реализации интерфейса. Таким образом, унаследованное сопоставление интерфейсов не влияет на сопоставление интерфейсов, установленное в повторной реализации этого интерфейса. Например, в объявлениях
|