Partial 3 страница
13.3 Полные имена членов интерфейса Иногда ссылка на член интерфейса имеет вид полного имени. Полное имя члена интерфейса состоит из имени интерфейса, в котором объявлен данный член, за которым следуют точка и имя нужного члена. Полное имя члена указывает на интерфейс, в котором объявлен этот член. Например, в объявлениях interface IControl interface ITextBox: IControl полным именем члена Paint является имя IControl.Paint, а полным именем члена SetText — имя ITextBox.SetText. В приведенном выше примере нельзя указать член Paint как ITextBox.Paint. Если интерфейс является частью пространства имен, полное имя члена интерфейса включает имя этого пространства имен. Например: namespace System Здесь полным именем метода Clone является имя System.ICloneable.Clone. 13.4 Реализации интерфейсов Интерфейсы реализуются в классах и структурах. Чтобы указать, что класс или структура реализуют интерфейс, в список базовых классов такого класса или структуры следует включить идентификатор соответствующего интерфейса. Например: interface ICloneable interface IComparable class ListEntry: ICloneable, IComparable public int CompareTo(object other) {...} Класс или структура, которые реализуют интерфейс, также неявно реализуют все его базовые интерфейсы. Это справедливо даже в том случае, если в списке базовых классов соответствующего класса или структуры не указаны явным образом все базовые интерфейсы. Например: interface IControl interface ITextBox: IControl class TextBox: ITextBox public void SetText(string text) {...} Здесь класс TextBox реализует как класс IControl, так и класс ITextBox. Базовые интерфейсы, указанные в объявлении класса, могут относиться к интерфейсам сформированного типа (§4.4). Базовый интерфейс не может быть параметром типа сам по себе, хотя он может включать параметры типа, находящиеся в соответствующей области. В следующем коде демонстрируется реализация класса и расширение сформированных типов: class C<U,V> {} interface I1<V> {} class D: C<string,int>, I1<string> {} class E<T>: C<int,T>, I1<T> {} Базовые интерфейсы объявления универсального класса должны удовлетворять правилу уникальности, которое изложено в §13.4.2. 13.4.1 Явные реализации членов интерфейса Для целей реализации интерфейсов в классе или структуре могут объявляться явные реализации членов интерфейса. Явная реализация члена интерфейса представляет собой объявление метода, свойства, события или индекса, содержащее ссылку на полное имя члена интерфейса. Например: interface IList<T> interface IDictionary<K,V> void Add(K key, V value); class List<T>: IList<T>, IDictionary<int,T> T IDictionary<int,T>.this[int index] {...} void IDictionary<int,T>.Add(int index, T value) {...} В этом примере строки IDictionary<int,T>.this и IDictionary<int,T>.Add являются явными реализациями членов интерфейса. В некоторых случаях имя члена интерфейса может быть неподходящим для реализующего класса. В этом случае член интерфейса может быть реализован с использованием явной реализации члена интерфейса. Например, в классе, который реализует абстракцию файла, скорее всего будет реализована функция-член Close, в результате выполнения этой функции высвобождается файловый ресурс и реализуется метод Dispose интерфейса IDisposable с использованием явной реализации члена интерфейса: interface IDisposable class MyFile: IDisposable public void Close() { Получить доступ к явной реализации члена интерфейса с использованием его полного имени в вызванном методе, обращении к свойству или индексатору невозможно. Доступ к явной реализации члена интерфейса можно получить только через экземпляр интерфейса, в этом случае обращение к нему следует выполнять просто по имени его члена. Включение в явную реализацию члена интерфейса модификаторов доступа, а также модификаторов abstract, virtual, override или static, приведет к ошибке при компилировании. Характеристики уровня доступа в явных реализациях члена интерфейса отличаются от таких характеристик других членов. Поскольку доступ к явным реализациям члена интерфейса по полному имени при вызове метода или при обращении к свойству невозможен, они в некотором роде являются закрытыми. Тем не менее, так как можно получить доступ к ним через экземпляр интерфейса, они также в некотором роде являются открытыми. Явные реализации члена интерфейса служат двум основным целям: · Поскольку к явным реализациям члена интерфейса нельзя получить доступ через экземпляры классов или структур, они позволяют исключить реализации интерфейса из открытого интерфейса класса или структуры. Это особенно полезно в том случае, если в классе или структуре реализуется внутренний интерфейс, который не предоставляет интереса для объекта, где используется этот класс или эта структура. · Явные реализации члена интерфейса позволяют разрешить неоднозначности членов интерфейса с одинаковой подписью. Без явных реализаций члена интерфейса было бы невозможно иметь разные реализации члена интерфейса с одинаковыми подписью и типом возвращаемого значения, а также было бы невозможно включить в класс или структуру любые реализации членов интерфейса с одинаковой подписью и разными типами возвращаемых значений. Явная реализация члена интерфейса является допустимой только в том случае, если в списке базовых классов класса или структуры содержится интерфейс, содержащий член, у которого полное имя, тип и типы параметров полностью совпадают с соответствующими данными явной реализации члена интерфейса. Так, в следующем классе class Shape: ICloneable int IComparable.CompareTo(object other) {...} // Недопустимо объявление метода IComparable.CompareTo приведет к возникновению ошибки при компилировании, поскольку интерфейс IComparable не включен в список базовых классов класса Shape и не является базовым интерфейсом для интерфейса ICloneable. Аналогичным образом в объявлениях
|